[Go 공식문서 한국어 정리] ①4②. Go 슬라이스: 사용법과 낮부 구조
Go 슬라이스: 사용법과 낮부 구조
https://go.dev/blog/slices-intro
Go의 슬라이스(slice)는 타입된 데이터 시퀀스를 다루는 편리하고 효율적인 방법입니다. 슬라이스는 다른 언어의 배열과 유사하지만 일부 특이한 속성을 가집니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
슬라이스는 Go의 배열(array)을 기반으로 한 추상화입니다. 배열은 크기가 고정되어 있지만 슬라이스는 가변적인 길이를 가집니다. 슬라이스는 낮부적으로 배열 세그먼트에 대한 기사서를 지니고 있습니다.
② 핵심 개념
1. 슬라이스 낮부 구조: 슬라이스는 3가지 요소로 구성됩니다:
- 배열에 대한 포인터(Pointer)
- 세그먼트의 길이(Length)
- 최대 길이(Capacity, 기본 배열의 원소 수)
2. 배열 vs 슬라이스: [4]int와 [5]int는 서로 다른 타입이지만, []int는 길이에 구애받지 않습니다.
3. make: make([]T, length, capacity)로 슬라이스를 생성합니다. 용량을 생략하면 길이와 같습니다.
4. nil 슬라이스: 슬라이스의 제로값은 nil이며, len/cap은 0을 반환합니다.
③ 주요 내용 상세
슬라이싱(Slicing)
b[1:4]은 인덱스 1부터 3까지의 요소를 포함합니다. 슬라이싱은 데이터를 복사하지 않고 새로운 슬라이스를 생성합니다.
b[:2]은 0부터 2전까지, b[2:]은 2부터 끝까지, b[:]은 전체를 나타냅니다.
copy 함수
func copy(dst, src []T) int
- src의 데이터를 dst로 복사합니다.
- 중첩된 슬라이스도 정확히 처리합니다.
- 복사한 요소 수를 반환합니다.
append 함수
func append(s []T, x ...T) []T
- 슬라이스의 끝에 요소를 추가합니다.
- 용량이 부족하면 더 큰 배열을 할당하여 슬라이스를 확장합니다.
- 다른 슬라이스를 추가할 때는 ...를 사용합니다: append(a, b...)
- nil 슬라이스에도 append를 할 수 있습니다.
주의사항(Gotcha)
슬라이싱은 기본 배열을 복사하지 않으므로, 작은 일부만 필요핵도 전체 배열이 메모리에 남아 있습니다. 이를 방지하려면 필요한 데이터를 새 슬라이스에 copy해야 합니다.
④ 실전 활용
- 동적 배열을 구현할 때 append와 copy를 조합해 사용합니다.
- 파일을 읽어서 일부만 반환할 때 복사를 해야 메모리 누수를 방지합니다.
- 슬라이스를 인수로 전달할 때 기본 배열의 참조가 전달되므로 주의가 필요합니다.
- 용량을 예상하고 make로 추정하면 append의 재할당을 줄일 수 있습니다.
⑤ 정리
슬라이스는 Go의 핵심 데이터 구조입니다. 길이와 용량의 차이, 슬라이싱의 복사 없음, copy와 append의 사용법을 정확히 알면 메모리 효율성을 높이고 배열 기반 작업을 쉽게 처리할 수 있습니다.
#Go #Golang #Slice #슬라이스 #Array #배열 #append #copy #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30