Go에서 배열과 슬라이스의 차이: 창고와 창고 안에서 물건 꺼내 쓰기

손태권·2024년 9월 13일
0

Golang

목록 보기
3/4
post-thumbnail

Go에서 배열과 슬라이스의 차이

Go언어를 공부하면서, 배열과 슬라이스의 개념이 js와는 많이 다르다는 것을 느꼇습니다.
js에서는 배열을 자유롭게 마치 무한확장가능한 리스트처럼 사용했지만 Go는 아니였습니다.

제가 깨달은 비유가 있는데, 배열을 창고이고 슬라이스는 창고에서 물건을 꺼내 쓰는 도구 라는 개념입니다.

1.Go에서의 배열: 창고

배열은 Go에서 고정된 크기의 창고 라고 생각하시면 됩니다. 창고 안에는 정해진 개수의 물건(데이터)을 넣어두고 더 이상 추가할 수 없습니다. 창고를 처음 만들때 크기를 정해놓으면, 그이후로는 그 창고의 크기를 변경할 수 없죠.

예를 들면 이렇습니다.

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

여기서 arr는 5개의 물건을 담고 있는 창고 입니다. 이창고는 항상 5개의 물건을 유지하며, 새로운 물건을 넣거나 크기를 줄일 수는 없습니다. Go배열은js와 달리 고정된 크기이기 때문입니다.

2.슬라이스: 창고안에서 물건 꺼내기

슬라이스 자체는 배열을 직접 담고 있지 않습니다. 슬라이스는 배열의 일부를 참조하는 도구입니다.
창고(배열) 안에 있는 물건을 꺼내서 특정 구간만 사용할 수 있습니다.
이 부분이 처음엔 헷갈렸습니다. 왜냐하면 js에서 배열은 그냥 동적으로 크기가 변하는 데이터 구조라, 이런 제한이 없었기 때문입니다.

s := arr[1:4]

이 코드는 배열 arr에서 두 번째부터 네 번째까지의 요소를 꺼내서 슬라이스 s로 만듭니다. 즉, s는 [2,3,4]라는 값을 가지고 있습니다. 이때 슬라이스는 배열 arr의 일부만 참조하고 있는 것이죠.

3.슬라이스의 길이와 용량

Go에서 슬라이스는 길이(len)용량(cap)이라는 개념을 가지고 있습니다. 길이는 슬라이스가 실제로 사용하고 있는 요소의 개수이고, 용량은 슬라이스가 참조하고 있는 배열의 총 크기입니다.

다시 창고 비유로 돌아가서, 슬라이스의 길이는 창고에서 실제로 꺼내서 사용하는 물건의 수를 말합니다. 반면, 용량은 창고에서 가져올 수 있는 최대 물건 수를 나타냅니다. 즉, 슬라이스의 길이가 3이라면 지금 당장 3개의 물건을 사용하고 있지만, 용량이 5라면 그 창고에는 아직 2개의 물건이 남아 있는 셈이죠.

4.슬라이스의 참조 특성

슬라이스는 배열을 참조하는 구조이기 때문에, 배열에서 값이 변경되면 그 슬라이스도 변경을 반영합니다. 예를 들어, 아래와 같이 슬라이스 s1과 s2가 같은 배열을 참조하는 상황이 있습니다.

arr := [5]int{1, 2, 3, 4, 5}
s1 := arr[1:3]  // [2, 3]
s2 := arr[2:5]  // [3, 4, 5]

s1[1] = 100     // s1에서 인덱스 1을 변경 -> 이는 arr[2]를 변경

fmt.Println(arr)  // [1, 2, 100, 4, 5]
fmt.Println(s2)   // [100, 4, 5]

여기서 s1[1]을 변경하면 배열 arr[2]가 변경되기 때문에, s2도 영향을 받아 [100, 4, 5]로 바뀌게 됩니다. 이 부분이 처음에 많이 헷갈렸지만, 슬라이스가 배열의 데이터를 복사하지 않고 참조한다는 것을 이해하니 좀 쉽게 다가왔습니다.

profile
서툰일을 해냈을때의 성취감

0개의 댓글