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

263자
4분

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

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

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
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]
}
 

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

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

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

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

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

YouTube 영상

채널 보기
존 매카시가 들려주는 인공지능의 탄생 이야기
API 응답 지연과 복잡한 에러, NestJS 인터셉터로 관리하는 방법 | NestJS 가이드
관점 지향 로깅 인터셉터 구현 및 전역 바인딩 전략 | NestJS 가이드
Pro펑터, 입력과 출력을 동시에 다루는 펑터 | 프로그래머를 위한 카테고리 이론
함수 타입과 Hom-Set 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터 인자 전달 및 파이프 검증 활용법 | NestJS 가이드
입력을 전처리하는 Functor - Contravariant와 contramap 이해하기 | 프로그래머를 위한 카테고리 이론
NestJS 커스텀 데코레이터, createParamDecorator 사용 | NestJS 가이드