-
[Golang] 배열 (array) & 슬라이스 (slice)언어/Golang 2020. 2. 9. 18:39
배열 (array)
Go에서 배열의 배열크기는 Type을 구성하는 한 요소입니다. 즉, [3]int와 [5]int는 서로 다른 타입으로 인식됩니다.
배열의 선언 및 초기화는 아래와 같습니다.
package main func main() { var a [3]int a[0] = 1 a[1] = 2 a[2] = 3 var b = [3]int{1,2,3} var c = [...]int{1,2,3} var d = [...]int{1,2} println(a[0]) println(b[0]) println(c[0]) println(d[0]) var aa = [2][3]int{ {1, 2, 3}, {4, 5, 6}, } println(aa[0][0]) }
슬라이스 (Slice)
Go 배열은 크기를 동적으로 증가시키거나 배열을 자르는 등의 기능을 가지고 있지 않습니다. 슬라이스는 배열과 달리 고정된 크기를 미리 지정하지 않을 수 있고, 크기를 동적으로 변경하거나 또한 배열을 자를 수 있습니다.
선언은 배열과 유사하지만 크기를 주지 않으면 슬라이스로 인식합니다.
슬라이스를 선언하는 방식은 2가지 인데 첫 번째 방법으로는 []int로 선언할 수 있습니다. 이처럼 선언하면 Golang에서 내부에서 사용할 수 있는 길이와 배열의 최대 길이를 정합니다.
두 번째로 make()함수를 사용하여 슬라이스를 사용할 수 있습니다. make()의 파라미터는 생성할 슬라이스의 타입, 슬라이스의 길이, 내부 배열의 최대 길이를 개발자가 지정할 수 있습니다. 이와 같이 선언이 되면 해당 슬라이스에는 0으로 가득 찬 슬라이스가 생성됩니다. 만약 세 번째 파라미터를 생략하면 두 번째 파라미터인 슬라이스의 길이와 동일하게 생성이 됩니다.
package main import "fmt" func main() { var a []int //슬라이스 변수 선언 a = []int{1, 2, 3} //슬라이스에 값 지정 a[1] = 10 fmt.Println(a, len(a), cap(a)) // [1 10 3], len 3, cap 3 b := make([]int, 5, 10) fmt.Println(b, len(b), cap(b)) // [0 0 0 0 0] , len 5, cap 10 var c []int fmt.Println(c, len(c), cap(c)) // [], len 0, cap 0 if c == nil { // true println("Nil Slice") } }
슬라이스에 값을 추가하거나 늘리는 일이 발생하면 내부 배열의 최대 길이까지는 기존 메모리 주소를 사용하지만 이를 넘게 되면 내부 배열의 최대 길이 * 2 만큼 어레이를 새로 생성하여 새로운 메모리에 해당 어레이 값들을 복사합니다.