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

2025. 10. 14. 18:15ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go

 

 

์‹œ์ž‘

์Šฌ๋ผ์ด์Šค๋Š” 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์žฅ ์Šฌ๋ผ์ด์Šค ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > Go' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Go] ํ˜•์‹์ง€์ •์ž Format ์ •๋ฆฌ(%v,%s,%d ๋“ฑ)  (0) 2025.11.07
[Go] Map ์›๋ฆฌ์™€ ํ™œ์šฉ(feat. hash)  (0) 2025.11.05
[Go] ๊ณ ๋ฃจํ‹ด(Goroutine)  (0) 2025.10.13
[Go] Gin ํ”„๋ ˆ์ž„์›Œํฌ  (1) 2025.09.20
[Go] ํ•จ์ˆ˜ ๊ณ ๊ธ‰(๊ฐ€๋ณ€ ์ธ์ˆ˜, defer, ๋žŒ๋‹คํ•จ์ˆ˜, ํ•จ์ˆ˜ํƒ€์ž… ๋ณ€์ˆ˜)  (0) 2025.09.19
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/Go' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Go] ํ˜•์‹์ง€์ •์ž Format ์ •๋ฆฌ(%v,%s,%d ๋“ฑ)
  • [Go] Map ์›๋ฆฌ์™€ ํ™œ์šฉ(feat. hash)
  • [Go] ๊ณ ๋ฃจํ‹ด(Goroutine)
  • [Go] Gin ํ”„๋ ˆ์ž„์›Œํฌ
์„œ์•„๋ž‘๐Ÿ˜ƒ
์„œ์•„๋ž‘๐Ÿ˜ƒ
Just Do It๐Ÿ’ช
  • ์„œ์•„๋ž‘๐Ÿ˜ƒ
    G-Stack
    ์„œ์•„๋ž‘๐Ÿ˜ƒ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (144)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (78)
        • C++ ๊ธฐ์ดˆ (28)
        • C++ ์‘์šฉ (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ (31)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (12)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (5)
      • ๋„คํŠธ์›Œํฌ (3)
      • ๋””์ž์ธํŒจํ„ด (5)
      • ์„œ๋น„์Šค & ํˆด (7)
      • ํŠธ๋ Œ๋“œ&์ด์Šˆ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • G์Šคํƒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฉ”๋ชจ๋ฆฌ
    ๋ฐฐ์—ด
    ์ปดํ“จํ„ฐ
    init
    RAM
    ํŒŒ์ด์ฌ
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํŒŒ์ผ์ž…์ถœ๋ ฅ
    ํŒจํ‚ค์ง€
    component
    fork
    ์Šคํƒ
    ๋ณ€์ˆ˜
    ํฌ์ธํ„ฐ
    c
    Thread
    ์žฌ๊ท€
    pointer
    ์กฐ๊ฑด๋ฌธ
    ํ•จ์ˆ˜
    ์ƒ์†
    ํ•˜๋“œ๋””์Šคํฌ
    STD
    ๋ฐ˜๋ณต๋ฌธ
    ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ
    c++
    ๋””์ž์ธํŒจํ„ด
    go
    cpu
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์„œ์•„๋ž‘๐Ÿ˜ƒ
[Go] ์Šฌ๋ผ์ด์Šค(slice)์—๋Š” ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋‹ค
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”