슬라이스 사용하기

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

레퍼런스 타입

슬라이스는 레퍼런스 타입입니다. 내장된 배열에 대한 포인터이므로 슬라이스끼리 대입하면 값이 복사되지 않고 참조(레퍼런스)만 합니다.

먼저 배열을 다른 배열에 대입해보겠습니다.

a := [3]int{1, 2, 3}
var b [3]int

b = a          // 배열의 요소가 모두 복사됨
b[0] = 9       // b[0]에 9를 대입하면 b의 첫 번째 요소만 바뀜

fmt.Println(a) // [1 2 3]
fmt.Println(b) // [9 2 3]

실행 결과

[1 2 3]
[9 2 3]

배열 a를 배열 b에 대입하여 배열의 요소가 모두 복사되었습니다. 그래서 b[0]에 값을 대입한 뒤 출력해보면 배열 b의 첫 번째 요소만 바뀝니다.

이제 슬라이스를 만들고 대입해보겠습니다.

a := []int{1, 2, 3}
var b []int    // 슬라이스로 선언

b = a          // a를 b에 대입해도 요소가 모두 복사되지 않고 참조만 함
b[0] = 9       // 슬라이스는 참조이므로 a[0], b[0]의 값이 모두 바뀜

fmt.Println(a) // [9 2 3]
fmt.Println(b) // [9 2 3]

실행 결과

[9 2 3]
[9 2 3]

슬라이스 a를 슬라이스 b에 대입하였습니다. 그리고 b[0]에 값을 대입한 뒤 값을 출력해보면 a[0]b[0] 모두 값이 바뀝니다. 슬라이스는 레퍼런스 타입이라 값이 복사되지 않고 참조만하기 때문입니다.

마찬가지로 함수의 매개변수에 배열을 넘기면 복사가 되지만 슬라이스를 넘기면 참조만 하게됩니다. 따라서 함수 안에서 슬라이스의 요소를 변경하면 함수 바깥에 있는 슬라이스도 값이 바뀝니다.


저작권 안내

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

Published

01 June 2015