Go : Array vs Slice

오병민·2021년 6월 14일
0

go

목록 보기
6/7
post-thumbnail

Array 와 Slice 는 얼핏 보면 같은 타입이라고 착각 할 수가 있다.

나는
"Array는 길이를 정해서 정의하면 Array라 부르고 길이를 명시하지 않으면 Slice 구나 어차피 둘 다 배열이네"
라고만 생각 했었다.

그러나 Go 에서는 엄연히 다른 type 으로 구분 하고 있다.

아래 예시를 보자.

func main(){
    a := [3]int{1,2,3}
    var b []int
    b = a
}

위에 코드를 보면

a 는 3의 길이를 가진 array int 타입 이고 b 는 동적으로 늘어날 수 있는 slice int 타입이다.

나는 똑같은 배열 이고 slice 는 언제든 늘어 날 수 있으니 a 를 b 에 넣을 수 있다고 생각했다.

그러나 둘은 다른 타입이라 친절하게 컴파일 에러가 생기게 된다.

이를 알게 되고나서 array와 slice 의 특징을 좀 찾아보게 되었다.

Array 와 Slice 특징

Array 는 배열 내 모든 값을 가지고 있는 타입이다.

이와 같은 특징 때문에 array는 자료형이 같아도 길이가 다르면 다른 타입이다.

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

a와 b는 길이가 다르기 때문에 다른 타입이다.

a는 3의 길이를 가진 int형 타입이다.
b는 4의 길이를 가진 int형 타입니다.

이렇게 해석 하도록 하자

Slice 는 레퍼런스 값을 저장 하는 타입이다.

이는 내부적으로는 배열을 통해서 값을 관리하며, slice 자체는 배열의 가장 첫번째 요소를 가리키는 포인터를 가지고 있다.

a := []int{1,2,3}
var b = a
b[2] = 10
fmt.Println(a, b)

출력
[1 2 10][1 2 10]

위 결과를 보면 알 수 있듯이 slice 타입은 주소 값을 가지고 있기 때문에 다른 변수에 대입 하게 될 경우 똑같은 원본을 가르키고 있음을 확인 할 수 있다.

복사 하기 위해서는 copy() 라는 함수를 사용하면 된다.

참고 자료 : 갈아먹는 go [1] array와 slice

profile
안녕하세요

0개의 댓글