Go : Array vs Slice
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
Author And Source
이 문제에 관하여(Go : Array vs Slice), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@obm4489/Go-Array-vs-Slice저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)