지노윈 2024. 4. 22. 11:48
반응형

슬라이스

배열은 정한 길이에서 더이상 크기가 늘어나지 않습니다.

슬라이스를 사용하면 이러한 불편을 해소 할 수 있습니다. 

 

다음 과 같이 선언하면 크기가 0인 슬라이스가 만들어 집니다.

크기를 초과한 접근을 하면 런타임에 패닉이 발생합니다.

var slice []int 

// 패닉 발생
slice[1] = 10

 

사용 방법

// {}로 초기화
var slice = []int{1, 2, 3}

// 다음은 크기가 3인 배열 선언, 구분합시다!
var array = [...]int{1, 2, 3}

// make로 초기화
var slice = make([]int, 3)

// append로 요소 추가
slice = append(slice, 4)
// append로 여러 값 추가
slice = append(slice, 4, 5, 6, 7)

 

슬라이스는  포인터를 사용한다는 특징이 있습니다. 때문에 메서드의 파라미터로 슬라이스를 사용할 경우 복사를 하여 값을 전달하는 것이 아니라 포인터의 주소를 전달한 다는 것을 유의 해야 겠습니다.

슬라이스가 포인터를 사용한다는 특징을 좀 더 구체적으로 살펴 보겠습니다.

var slice1 = []int{1, 2, 3}
slice2 := append(slice1, 4, 5}
slice1[1] = 20

 

위 코드를 실행하고 나면 slice2[1]의 값은 무엇을까요?

slice1과 slice2는 동일한 메모리 주소를 가리키고 있기 때문에 slice1[1]과 slice[2]의 값은 모두 20입니다.

그리고, append사용 시 공간이 부족할 경우 2배 크기의 메모리를 확보 후 기존 값을 복사하고 추가되는 값을 채웁니다.

슬라이싱

배열의 일부를 집어내는 기능입니다. 그 결과로 슬라이스를 반환합니다.

array[startIndex:endIndex]
// startIndex : 시작 인덱스
// endIndex : 끝 인덱스

 

사용 예

array := [5]int{0, 1, 2, 3, 4}

slice := array[1:3] // 1, 2, 3 슬라이스 반환

 

슬라이스 복제

var slice1 = []int{1, 2, 3}
slice2 := make([]int, len(slice1))
copy(slice2, slice1)

 

슬라이스 정렬

var slice = []int{5, 4, 1, 3, 2}
sort.Ints(slice)

 

슬라이스 정렬

var slice = []int{5, 4, 1, 3, 2}
sort.Ints(slice)