ABOUT ME

-

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

    댓글