PHpullh
학습 라이브러리/Go/슬라이스 내부 구조

GO · 컬렉션

슬라이스 내부 구조

슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.

컬렉션중급sliceinternalcapacitycopyappend

핵심 설명

슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.

Go code

package main

import "fmt"

func main() {
	// 슬라이스 헤더: (ptr, len, cap)
	s := make([]int, 3, 5)
	fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)

	// append: 용량 초과 시 새 배열 할당
	s = append(s, 1, 2)    // cap 5 이내
	fmt.Printf("len=%d cap=%d\n", len(s), cap(s))

	s = append(s, 3)       // cap 초과 → 새 배열
	fmt.Printf("len=%d cap=%d\n", len(s), cap(s))

	// 서브슬라이스는 원본과 배열 공유!
	a := []int{1, 2, 3, 4, 5}
	b := a[1:3]             // [2, 3]
	b[0] = 99
	fmt.Println(a) // [1 99 3 4 5] — 원본도 변경됨!

	// 독립 복사
	c := make([]int, len(a))
	copy(c, a)
	c[0] = 0
	fmt.Println(a[0], c[0]) // 1 0
}

학습 팁

서브슬라이스가 원본과 메모리를 공유하는 것을 방지하려면 copy 또는 append([]T{}, slice...)로 복사하세요.

주의할 점

append가 용량을 초과하면 새 배열을 할당합니다. 기존 서브슬라이스는 여전히 옛 배열을 가리키므로 데이터 불일치가 발생할 수 있습니다.

자주 묻는 질문

슬라이스 내부 구조란 무엇인가요?

슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.

슬라이스 내부 구조 학습 시 주의할 점은 무엇인가요?

append 가 용량을 초과하면 새 배열을 할당합니다. 기존 서브슬라이스는 여전히 옛 배열을 가리키므로 데이터 불일치가 발생할 수 있습니다.