배열 (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 만큼 어레이를 새로 생성하여 새로운 메모리에 해당 어레이 값들을 복사합니다.

'언어 > Golang' 카테고리의 다른 글

[Golang] package 관리, 선언하기  (0) 2020.02.16
[Golang] http 모듈 사용하기  (0) 2020.02.16
[Golang] map  (0) 2020.02.09
[Golang] 배열 (array) & 슬라이스 (slice)  (0) 2020.02.09
[Golang] 함수 (function)  (0) 2020.02.09
[GO] 데이터 타입 & 연산자  (0) 2020.02.09
[Golang] 조건문 (if) & Switch문  (0) 2020.02.09