🔥 배열을 참조하는 슬라이스

263자
4분

Go 언어에서 슬라이스는 배열의 일부분을 참조하는 참조 타입이에요. 슬라이스 자체는 어떤 데이터도 저장하지 않고, 단지 기본 배열의 일부분을 기술할 뿐이죠.

슬라이스의 요소를 변경하면 기본 배열의 해당 요소도 함께 변경돼요. 동일한 기본 배열을 공유하는 다른 슬라이스들도 그 변경사항을 볼 수 있어요.

package main
 
import "fmt"
 
func main() {
	// 문자열 4개로 이루어진 배열 names를 선언해요.
	names := [4]string{
		"John",
		"Paul",
		"George",
		"Ringo",
	}
	fmt.Println(names) // 배열 names의 내용을 출력해요: [John Paul George Ringo]
 
	// 슬라이스 a는 배열 names의 인덱스 0부터 2 미만까지 참조해요.
	a := names[0:2]
	// 슬라이스 b는 배열 names의 인덱스 1부터 3 미만까지 참조해요.
	b := names[1:3]
	fmt.Println(a, b) // 슬라이스 a와 b의 내용을 출력해요: [John Paul] [Paul George]
 
	// 슬라이스 b의 첫 번째 요소를 "XXX"로 변경해요.
	b[0] = "XXX"
	fmt.Println(a, b) // 슬라이스 a와 b의 내용을 출력해요: [John XXX] [XXX George]
	fmt.Println(names) // 배열 names의 내용을 출력해요: [John XXX George Ringo]
}
 
go

위 코드에서 먼저 문자열 4개로 이루어진 배열 names를 선언했어요. 그리고 names의 일부분을 참조하는 두 개의 슬라이스 ab를 만들었죠.

슬라이스 anames의 인덱스 0부터 2 미만까지 참조하고, 슬라이스 bnames의 인덱스 1부터 3 미만까지 참조해요. 이때 슬라이스 ab는 서로 겹치는 부분이 있죠.

슬라이스 b의 첫 번째 요소를 "XXX"로 변경하면, 슬라이스 a와 배열 names의 해당 요소도 함께 변경돼요. 이는 슬라이스가 배열의 일부분을 참조하기 때문이에요.

따라서 슬라이스를 사용할 때는 기본 배열의 어떤 부분을 참조하는지, 그리고 다른 슬라이스와 겹치는 부분이 있는지 주의해야 해요. 슬라이스의 요소를 변경하면 기본 배열과 다른 슬라이스에도 영향을 줄 수 있기 때문이죠.

슬라이스를 활용하면 배열의 일부분만 효율적으로 다룰 수 있어요. 하지만 슬라이스가 배열의 일부분을 참조한다는 점을 이해하고 사용해야 의도치 않은 결과를 피할 수 있겠죠?