슬라이스 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

슬라이스는 배열과 같지만, 길이가 고정되어 있지 않으며 동적으로 크기가 늘어납니다. 또한 배열과는 달리 레퍼런스 타입입니다. 이제 var 키워드로 슬라이스를 생성해보겠습니다.

  • var 슬라이스명 []자료형
var a []int // int형 슬라이스 선언

슬라이스는 배열과 달리 [ ] (대괄호)안에 길이를 지정하지 않습니다. 이렇게 생성된 슬라이스의 길이는 0입니다.

슬라이스는 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있습니다. 여기서 슬라이스 선언과 동시에 make 함수를 사용하면 대괄호와 자료형은 생략할 수 있습니다. 또한, 일반 변수와 마찬가지로 :=를 사용하여 var를 생략할 수 있습니다.

  • make([]자료형, 길이)
var a []int = make([]int, 5) // make 함수로 int형에 길이가 5인 슬라이스에 공간 할당
var b = make([]int, 5)       // 슬라이스를 선언할 때 자료형과 [] 생략
c := make([]int, 5)          // 슬라이스를 선언할 때 var 키워드, 자료형과 [] 생략

슬라이스에 공간을 할당할 것이므로 make 함수의 첫 번째 매개변수에는 대괄호에 길이를 설정하지 않은 상태로 자료형을 지정합니다. 그리고 두 번째 매개변수에는 슬라이스의 길이를 설정합니다. 이렇게 슬라이스를 생성하고 공간을 할당하면 슬라이스의 요소는 모두 0으로 초기화됩니다.

슬라이스를 생성하면서 값을 초기화하려면 { } (중괄호)를 사용합니다. 중괄호에서 값은 한 줄로 나열해도 되고 여러 줄로 나열해도 됩니다(여러 줄로 나열할 때는 마지막 요소에도 콤마를 붙여줍니다). 슬라이스이므로 대괄호에는 길이를 설정하지 않습니다.

a := []int{32, 29, 78, 16, 81} // 슬라이스를 생성하면서 값을 초기화

b := []int{
	32,
	29,
	78,
	16,
	81,  // 여러 줄로 나열할 때는 마지막 요소에 콤마를 붙임
}

실제로 슬라이스는 배열을 내장하고 있는데, 이 배열이 더 늘어났을 때 사용할 공간을 미리 할당할 수 있습니다.

  • make([]자료형, 길이, 용량)
var s = make([]int, 5, 10) // 길이가 5이고 용량이 10인 슬라이스 생성

이렇게 생성하면 길이가 5이며 용량이 10인 슬라이스가 생성됩니다. 여기서 슬라이스 길이는 용량보다 크게 설정할 수 없습니다. 또한 용량을 생략하면 용량은 길이와 동일하게 설정됩니다.

  • 길이: 인덱스로 접근할 수 있는 공간입니다(슬라이스 내부 배열의 최대 길이). 용량이 더 확보되어 있더라도 길이 이상의 인덱스에 접근하면 런타임 에러가 발생합니다.
  • 용량: 실제 메모리에 할당된 공간입니다. 만약 슬라이스에 요소를 추가하여 용량이 가득차면 용량은 자동으로 늘어납니다.


그림 22-1 슬라이스의 길이와 용량

미리 슬라이스의 용량을 크게 할당하면 요소가 추가될 때마다 메모리를 새로 할당하지 않아도 되므로 성능상 이점이 있습니다. 단, 처음부터 메모리 공간을 많이 차지게 됩니다. 반대로 슬라이스 용량을 적게 할당하면 처음부터 메모리 공간은 적게 차지하지만, 요소가 추가될 때마다 메모리를 새로 할당하게 되므로 성능이 떨어질 수 있습니다.

슬라이스의 길이는 len 함수로 구할 수 있으며, 용량은 cap 함수로 구할 수 있습니다.

a := make([]int, 5, 10)

fmt.Println(len(a)) // 길이는 5
fmt.Println(cap(a)) // 용량은 10

실행 결과

5
10

단 용량이 길이보다 크더라도 길이를 벗어난 인덱스에는 접근할 수 없습니다.

a := make([]int, 5, 10) // 길이가 5이면 a[0], a[1], a[2], a[3], a[4]가 생성

fmt.Println(a[4]) // 0: make 함수를 사용하면 슬라이스의 요소는 모두 0으로 초기화
fmt.Println(a[5]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
fmt.Println(a[8]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생

실행 결과

0
panic: runtime error: index out of range

저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015