배열
배열은 데이터를 순차적으로 저장하는 구조이다.
go에서 배열의 첫번째는 0부터 할당하며 그 다음은 1, 2 순서로 인덱스를 부여한다.
package main import "fmt" func main() { var a [3]int // int 형 3개 요소를 갖는 배열 선언 a[0] = 1 // 값 입력 a[1] = 2 a[2] = 3 fmt.Println(a) fmt.Println(a[1]) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run array.go [1 2 3] 2
변수를 정의하자마자 값을 지정하는 것 처럼 배열도 초기값을 지정할 수 있다.
package main import "fmt" func main() { var a1 = [3]int{1, 2, 3} // int 형 3개 요소를 갖는 배열 선언 var a2 = [...]int{1, 2, 3} // int 형 배열 선언하나 크기는 자동으로 fmt.Println(a1) fmt.Println(a2) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run array.go [1 2 3] [1 2 3]
다차원 배열
golang 은 다차원 배열을 지원한다. 배열 크기부분을 복수개로 선언하면 된다.
package main import "fmt" func main() { var aa [4][3]int aa[2][2] = 10 fmt.Println(aa) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run array.go [[0 0 0] [0 0 0] [0 0 10] [0 0 0]]
다차원 배열의 초기값 지정은 단차원 배열의 초기값 지정과 비슷하다.
package main import "fmt" func main() { var a = [3][3]int{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, } fmt.Println(a[1][2]) fmt.Println(a) }
└─$ go run array.go 6 [[1 2 3] [4 5 6] [7 8 9]]
슬라이스
배열의 크기를 자동으로 지정할 순 있어도 지정된 크기를 동적으로 확장하는 기능은 없다. 이를 포함한 몇가지 제약을 해소하기 위해 Go에서는 슬라이스(Slice) 기능이 있다.
슬라이스는 크기를 미리 지정하지 않을 수 있고 그 크기가 나중에 동적으로 변경할 수 있고 부분 배열을 발췌할 수 있다.
package main import "fmt" func main() { var a []int // 슬라이스 변수 선언 a = []int{1, 2, 3} //변수에 값 저장 fmt.Println(a) a[1] = 10 fmt.Println(a) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go [1 2 3] [1 10 3]
Go에서 슬라이스 변수를 선언하는 다른 방법은 make() 함수를 이용할 수 있다.
이 함수를 이용하면 길이(Length)와 용량(Capacity)를 지정할 수 있다.
package main import "fmt" func main() { a := make([]int, 1, 3) fmt.Println(a) fmt.Println(len(a), cap(a)) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go [0] 1 3
슬라이스에 별도의 길이와 용량을 지정하지 않으면 기본적으로 0으로 설정되는데 이를 NIL Slice 라고 한다.
package main import "fmt" func main() { var a []int if a == nil { fmt.Println("NIL Slice") } fmt.Println(a) fmt.Println(len(a), cap(a)) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go NIL Slice [] 0 0
부분 슬라이스
슬라이스에서 일부를 발췌해 부분 슬라이스를 만들 수 있다.
부분 슬라이스는 ” 슬라이스[처음인덱스:마지막인덱스] ” 형식이다.
package main import "fmt" func main() { a := []int{0, 1, 2, 3, 4, 5} fmt.Println(a) fmt.Println(len(a), cap(a)) a = a[2:6] // 처음 인덱스와 마지막 인덱스 지정 fmt.Println(a) fmt.Println(len(a), cap(a)) a = a[1:] // 적지 않음으로 생략 가능 [:] 일 경우 전체를 의미 fmt.Println(a) fmt.Println(len(a), cap(a)) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go [0 1 2 3 4 5] 6 6 [2 3 4 5] 4 4 [3 4 5] 3 3
슬라이스 병합과 복사
슬라이스는 자유롭게 새로운 요소를 추가할 수 있다. 슬라이스에 추가하기 위해선 내장된 함수인 append()를 사용한다.
package main import "fmt" func main() { a := []int{0, 1} fmt.Println(a) a = append(a, 2) fmt.Println(a) a = append(a, 3, 4, 5) fmt.Println(a) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go [0 1] [0 1 2] [0 1 2 3 4 5]
append() 함수를 통해 슬라이스
슬라이스에서 내장된 함수인 copy()를 이용해 한 슬라이스를 다른 슬라이스로 복사할 수 있다.
package main import "fmt" func main() { a := []int{0, 1, 2} fmt.Println(a) b := []int{3, 4, 5} fmt.Println(b) a = append(a, b...) // ... 기호는 해당 슬라이스의 모든 요소를 의미함 fmt.Println(a) copy(a, b) // (target, source) 형식임. 따라서 기존 0, 1, 2 를 순서대로 대체함 fmt.Println(a) }
┌──(daleji㉿DESKTOP)-[~] └─$ go run slice.go [0 1 2] [3 4 5] [0 1 2 3 4 5] [3 4 5 3 4 5]