๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go

[Go] ์Šฌ๋ผ์ด์Šค(slice)์—๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค

by ์„œ์•„๋ž‘๐Ÿ˜ƒ 2025. 10. 14.

 

 

์‹œ์ž‘

์Šฌ๋ผ์ด์Šค๋Š” Go์—์„œ ๊ฐ€๋ณ€๊ธธ์ด ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ๊ณ ์ •๊ธธ์ด ๋ฐฐ์—ด์€ var arr [10]int ์ด์ง€๋งŒ ์Šฌ๋ผ์ด์Šค๋Š” var slice []int์ž…๋‹ˆ๋‹ค.
์ดˆ๊ธฐ ์Šฌ๋ผ์ด์Šค๋Š” ๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

package main

import "fmt"

func main() {
	var slice []int

	if len(slice) == 0 { // โถ slice ๊ธธ์ด๊ฐ€ 0์ธ์ง€ ํ™•์ธ
		fmt.Println("slice is empty", slice)
	}

	slice[1] = 10 // โท ์—๋Ÿฌ ๋ฐœ์ƒ
	fmt.Println(slice)
}

 

์ดˆ๊ธฐํ™”

[] ์ด์šฉ

var slice1 = []int{1, 2, 3}
var slice2 = []int{1, 5:2, 10:3} // [1 0 0 0 0 2 0 0 0 0 3] //์ธ๋ฑ์Šค 5๋Š” 2, 10์€ 3


make() ์ด์šฉ

var slice = make([]int, 3)

 

์š”์†Œ ์ถ”๊ฐ€

//ch18/ex18.3/ex18.3.go
package main

import "fmt"

func main() {
	var slice []int

	for i := 1; i <= 10; i++ { // โถ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€
		slice = append(slice, i)
	}

	slice = append(slice, 11, 12, 13, 14, 15) // โท ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์†Œ ์ถ”๊ฐ€
	fmt.Println(slice)
}

 

์Šฌ๋ผ์ด์Šค ๋‚ด๋ถ€ ๊ตฌ์กฐ

  • ptr (*Elem): ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.
  • len (int): ์Šฌ๋ผ์ด์Šค์˜ ํ˜„์žฌ ๊ธธ์ด, len() ํ•จ์ˆ˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • cap (int): ์Šฌ๋ผ์ด์Šค์˜ ์ตœ๋Œ€ ์šฉ๋Ÿ‰, cap() ํ•จ์ˆ˜๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Golang ์Šฌ๋ผ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ (์˜ˆ: ์š”์†Œ ์ถ”๊ฐ€, ์ œ๊ฑฐ), Go ๋Ÿฐํƒ€์ž„์€ ์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ํ• ๋‹น๋˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ Go ์ฝ”๋“œ์—์„œ๋Š” ์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค ์กฐ์ž‘์€ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜์™€ ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

https://medium.com/@oneee/go%EC%9D%98-slice-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-b720226adee4

 

 

๋ฐฐ์—ด๊ณผ์˜ ์ฐจ์ด

package main

import "fmt"

func changeArray(array2 [5]int) { // โถ ๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ ์„ธ ๋ฒˆ์งธ ๊ฐ’ ๋ณ€๊ฒฝ
	array2[2] = 200
}

func changeSlice(slice2 []int) { // โท ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ฐ›์•„์„œ ์„ธ ๋ฒˆ์งธ ๊ฐ’ ๋ณ€๊ฒฝ
	slice2[2] = 200
}

func main() {
	array := [5]int{1, 2, 3, 4, 5}
	slice := []int{1, 2, 3, 4, 5}

	changeArray(array)
	changeSlice(slice)

	fmt.Println("array:", array)
	fmt.Println("slice:", slice)
}

// array: [1 2 3 4 5]
// slice: [1 2 200 4 5]

Go ์–ธ์–ด์—์„œ๋Š” ๋ชจ๋“  ๊ฐ’์˜ ๋Œ€์ž…์€ ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋  ๋•Œ๋‚˜ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ๋Œ€์ž…ํ•  ๋•Œ ๊ฐ’์˜ ์ด๋™์€ ๋ณต์‚ฌ์ž…๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ€ ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋œ ์Šฌ๋ผ์ด์Šค๋„ ๊ฐ™์€ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


append์‹œ ์ฃผ์˜์‚ฌํ•ญ

package main

import "fmt"

func main() {
	slice1 := make([]int, 3, 5) // โถ len:3 cap:5 ์Šฌ๋ผ์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค

	slice2 := append(slice1, 4, 5)
	// cap() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์Šฌ๋ผ์ด์Šค capacity ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
	fmt.Println("slice1:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))

	slice1[1] = 100 // โท slice2๊นŒ์ง€ ๋ฐ”๋€๋‹ˆ๋‹ค.

	fmt.Println("After change second element")
	fmt.Println("slice1:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))

	slice1 = append(slice1, 500) // โธ ์—ญ์‹œ slice2๊นŒ์ง€ ๋ฐ”๋€๋‹ˆ๋‹ค.

	fmt.Println("After append 500")
	fmt.Println("slice1:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))
}

/*
slice1: [0 0 0] 3 5
slice2: [0 0 0 4 5] 5 5
After change second element
slice1: [0 100 0] 3 5
slice2: [0 100 0 4 5] 5 5
After append 500
slice1: [0 100 0 500] 4 5
slice2: [0 100 0 500 5] 5 5
*/

appendํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋Š” ์ƒˆ๋กœ์šด ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. slice1์— appendํ•จ์ˆ˜๋ฅผ ์ ์šฉ์‹œ์ผœ ์ƒˆ๋กœ์šด slice2๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด, slice1๊ณผ slice2๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ํ˜„์ƒ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„ ์˜ˆ์ œ์—์„œ len 3, cap 3์ธ slice1์œผ๋กœ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

package main

import "fmt"

func main() {
	slice1 := []int{1, 2, 3} // โถ len:3 cap:3 ์Šฌ๋ผ์ด์Šค ์ƒ์„ฑ

	slice2 := append(slice1, 4, 5) // โท append() ํ•จ์ˆ˜๋กœ ์š”์†Œ ์ถ”๊ฐ€

	fmt.Println("slice1:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))

	slice1[1] = 100 // โธ slice1 ์š”์†Ÿ๊ฐ’ ๋ณ€๊ฒฝ

	fmt.Println("After change second element")
	fmt.Println("slice:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))

	slice1 = append(slice1, 500) // โž slice1 ์š”์†Ÿ๊ฐ’ ๋ณ€๊ฒฝ

	fmt.Println("After append 500")
	fmt.Println("slice1:", slice1, len(slice1), cap(slice1))
	fmt.Println("slice2:", slice2, len(slice2), cap(slice2))
}

/*
slice1: [1 2 3] 3 3
slice2: [1 2 3 4 5] 5 6
After change second element
slice: [1 100 3] 3 3
slice2: [1 2 3 4 5] 5 6
After append 500
slice1: [1 100 3 500] 4 6
slice2: [1 2 3 4 5] 5 6
*/

appendํ•  ๋•Œ ๋นˆ ๊ณต๊ฐ„์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ธธ์ด 6๊ฐœ์งœ๋ฆฌ(cap:3 * 2) ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋’ค slice1 ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ณ  ๋งจ ๋’ค์— 4, 5๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ len: 5, cap: 6 ์Šฌ๋ผ์ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ ์Šฌ๋ผ์ด์Šค๋ฅผ ๋Œ€์ž…ํ•œ slice2์€ slice1๊ณผ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ append()๋Š” ์Šฌ๋ผ์ด์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด์— ๋นˆ ๊ณต๊ฐ„์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋” ํฐ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ž˜ ์ธ์ง€ํ•ด์„œ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์Šฌ๋ผ์ด์Šค ๋ณต์ œ

make๋กœ ์ƒˆ๋กœ์šด ์Šฌ๋ผ์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

package main

import "fmt"

func main() {
	slice1 := []int{1, 2, 3, 4, 5}

	slice2 := make([]int, len(slice1)) // โถ slice1๊ณผ ๊ฐ™์€ ๊ธธ์ด์˜ ์Šฌ๋ผ์ด์Šค ์ƒ์„ฑ

	for i, v := range slice1 { // โท slice1์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ’ ๋ณต์‚ฌ
		slice2[i] = v
	}

	slice1[1] = 100 // โธ slice1 ์š”์†Ÿ๊ฐ’ ๋ณ€๊ฒฝ
	fmt.Println(slice1)
	fmt.Println(slice2)
}

/*
[1 100 3 4 5]
[1 2 3 4 5]
*/

copy() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. copy()๋Š” ํƒ€๊ฒŸ ์Šฌ๋ผ์ด์Šค, ์›๋ณธ ์Šฌ๋ผ์ด์Šค ์ˆœ์„œ๋Œ€๋กœ ์ธ์ž๋ฅผ ๋„ฃ๊ณ , ๋ณต์‚ฌ๋œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

package main

import "fmt"

func main() {
	slice1 := []int{1, 2, 3, 4, 5}
	slice2 := make([]int, 3, 10) // โถ len:3, cap:10 ์Šฌ๋ผ์ด์Šค
	slice3 := make([]int, 10)    // โท len:10, cap:10 ์Šฌ๋ผ์ด์Šค

	cnt1 := copy(slice2, slice1) // โธ slice1์„ slice2์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
	cnt2 := copy(slice3, slice1) // โน slice1์„ slice3์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

	fmt.Println(cnt1, slice2)
	fmt.Println(cnt2, slice3)
}

/*
3 [1 2 3]
5 [1 2 3 4 5 0 0 0 0 0]
*/

slice2๋Š” len์ด 3์ด๊ธฐ ๋•Œ๋ฌธ์— 3๊ฐœ๋งŒ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค. copy()ํ•จ์ˆ˜๋Š” ๋‘ ์Šฌ๋ผ์ด์Šค์˜ ๊ธธ์ด ์ค‘ ๋” ์ž‘์€ ๊ฐ’๋งŒํผ์˜ ์š”์†Œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

Turker์˜ Go ์–ธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ 18์žฅ ์Šฌ๋ผ์ด์Šค ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

 

๋Œ“๊ธ€