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는 자료형이 같아도 길이가 다르면 다른 타입이다.
a := [3]int{1,2,3} b := [4]int{1,2,3,4}
a와 b는 길이가 다르기 때문에 다른 타입이다.
a는 3의 길이를 가진 int형 타입이다.
b는 4의 길이를 가진 int형 타입니다.
이렇게 해석 하도록 하자
이는 내부적으로는 배열을 통해서 값을 관리하며, 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