Go의 배열
배열은 동일한 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조이다. Go 언어에서 배열은 다음과 같이 정의한다.
1package main
2
3import "fmt"
4
5func main() {
6 var t [5]float64 = [5]float64{24.0, 25.9, 26.0, 27.0, 28.0} // float64형 5개 요소를 가지는 배열 선언
7
8 for i := 0; i < len(t); i++ {
9 fmt.Println(t[i]) // 배열 요소 출력
10 }
11}
12
만약 값을 지정하지 않고 배열을 선언하면, 각 요소는 타입별 기본값으로 초기화된다.
1package main
2
3import "fmt"
4
5func main() {
6 var t [5]float64 // float64형 5개 요소를 가지는 배열 선언
7
8 for i := 0; i < len(t); i++ {
9 fmt.Println(t[i]) // 배열 요소 출력
10 }
11
12 // 출력 결과
13 // 0
14 // 0
15 // 0
16 // 0
17 // 0
18}
19
배열 선언시 개수는 항상 상수로 지정해야 한다.
1package main
2
3const CONSTANT = 3
4
5func main() {
6 v := 5
7 a := [v]int{1, 2, 3, 4, 5} // 에러 발생
8 b := [CONSTANT]int{1, 2, 3} // 정상
9
10 var c [10]int // 정상
11}
12
13
range
배열을 순회할 때는 range 키워드를 사용한다.
1package main
2
3import "fmt"
4
5func main() {
6 t := [5]float64{24.0, 25.9, 26.0, 27.0, 28.0} // float64형 5개 요소를 가지는 배열 선언
7
8 for i, v := range t {
9 fmt.Println(i, v) // 배열 요소 출력
10 }
11}
12
배열 복사
배열을 복사할 때는 = 연산자를 사용한다.
1package main
2
3import "fmt"
4
5func main() {
6 a := [5]int{1, 2, 3, 4, 5}
7 b := a // 배열 복사
8
9 fmt.Println(a) // [1 2 3 4 5]
10 fmt.Println(b) // [1 2 3 4 5]
11
12 b[0] = 10 // b의 첫 번째 요소를 변경
13
14 fmt.Println(a) // [1 2 3 4 5]
15 fmt.Println(b) // [10 2 3 4 5]
16}
17
만약 복사한 배열의 타입이 다르다면, 컴파일 에러가 발생한다.
1package main
2
3import "fmt"
4
5func main() {
6 a := [5]int{1, 2, 3, 4, 5}
7 var b [5]int64
8
9 b = a // 에러 발생
10}
11
Go에서 배열의 복사는 깊은 복사이다. 따라서 배열을 복사하면 원본 배열과 복사한 배열은 서로 독립적인 메모리 공간을 가진다.
다차원 배열
다차원 배열은 다음과 같이 정의한다.
1package main
2
3import "fmt"
4
5func main() {
6 var a = [2][2]int{{1, 2}, {3, 4}}
7
8 fmt.Println(a) // [[1 2] [3 4]]
9}
10
배열 크기
Go의 배엻의 크기는 타입의 크기 * 배열의 길이이다. 따라서 배열의 크기는 컴파일 시점에 결정된다.