개발/Go

[Go 언어 학습기 #5] Go 언어(Golang) 의 배열

황동리 2025. 12. 17. 13:32
반응형


이 글은 Must Have Tucker의 Go 언어 프로그래밍 책을 참고하여 작성하였으며, 개인적인 학습 내용을 정리한 글입니다.


배열 이란?

배열은 타입이 같은 값 여러 개를 가지는 자료 구조 입니다.


위 이미지로 좀 더 자세히 설명을 드리자면,

  • 배열을 이루는 각 값은 요소 라고 합니다.
  • 또한 요소를 가리키는 위치 값을 인덱스 라고 합니다.
  • 여기서 인덱스는 1부터 시작하는 것이 아닌 0부터 시작을 합니다.

배열을 사용하는 장점은 타입이 같은 여러 데이터를 변수 하나로 묶어서 효과적으로 다룰 수 있는 점 입니다.

배열 정의 방법

배열 정의 방법은 아래와 같습니다.

var 변수명 [요소 개수]타입

ex)
var t [5]float64

위와 같은 방식으로 배열을 정의 합니다.


간단한 예제를 통해 사용법을 익혀보면,

package main

import (
    "fmt"
)

func main() {
    var t [5]float64 = [5]float64{98.1, 93.2, 77.3, 82.4, 83.5}
    for i := 0; i < 5; i++ {
        fmt.Println(t[i])
    }
}
---
98.1
93.2
77.3
82.4
83.5

배열 선언 시 개수는 항상 상수

말 그대로 배열 선언 시 개수는 항상 상수를 써야 합니다.

package main

const Y int = 3

func main() {
    x := 5
    a := [x]int{1, 2, 3, 4, 5}
    b := [Y]int{1, 2, 3}
    var c [10]int
}
---
non-constant array bound x

이런 에러가 발생하는 이유는 변수로 선언된 x는 배열 개수로 사용할 수 없기 때문 입니다.


하지만 Y는 상수로 선언됐기 때문에 에러가 발생하지 않습니다.
또한 상수 10도 배열 개수로 지정할 수 있기 때문에 에러가 발생하지 않습니다.

배열 요소 읽고 쓰기

배열 요소에 접근하여 값을 읽고 쓰려면 배열 번호에 대괄호 []를 쓰고 그 사이에 접근하고자 하는 요소의 인덱스를 적습니다.


예시를 통해 알아보겠습니다.

package main

import "fmt"

func main() {
    nums := [...]int{10, 20, 30, 40, 50}

    nums[2] = 300    # 배열 요소 중 2번 인덱스의 값을 300으로 변경

    for i := 0; i < len(nums); i++ {
        fmt.Println(nums[i])
    }
}
---
10
20
300
40
50

결과를 보면

  • 인덱스 0, 10
  • 인덱스 1, 20
  • 인덱스 2, 300
  • 인덱스 3, 40
  • 인덱스 4, 50

이렇게 할당이 되어 결과값이 나온 것을 알 수 있습니다.

range 순회

for 반복문에서 range 키워드를 이용하면 배열 요소를 순회할 수 있습니다.


예시를 통해 알아보겠습니다.

package main

import "fmt"

func main() {
    var t [5]int = [5]int{10, 20, 30, 40, 50}

    for i, v := range t {
        fmt.Println(i, v)
    }
}
---
0 10
1 20
2 30
3 40
4 50

보면 배열의 각 요소를 순회하면서 인덱스와 요솟값 두 값을 반환하는 것을 볼 수 있습니다.

for i, v := range t {
    fmt.Println(v)
}

for문에서 i 변수는 인덱스, v는 변수 요소 값 입니다.

여기서 인덱스는 필요 없고 변수 요소 값만 필요하면 밑줄_ 을 사용해서 인덱스 를 무효화할 수 있습니다.

for _, v := range t {
    fmt.Println(v)
}

배열 복사

대입 연산자를 사용하면 배열 대 배열을 복사할 수 있습니다.


예제를 통해 알아보겠습니다.

//ch10/ex10.5/ex10.5.go
package main

import "fmt"

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    b := [5]int{500, 400, 300, 200, 100}

    for i, v := range a { // ❶ 배열 a 원소 출력
        fmt.Printf("a[%d] = %d\n", i, v)
    }

    fmt.Println()         // ❷ 개행
    for i, v := range b { // ❸ 배열 b 원소 출력
        fmt.Printf("b[%d] = %d\n", i, v)
    }

    b = a // ❹ a 배열을 b변수에 복사

    fmt.Println()         // 개행
    for i, v := range b { // ➎ 배열 b 원소 출력
        fmt.Printf("b[%d] = %d\n", i, v)
    }
}
---
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 5

b[0] = 500
b[1] = 400
b[2] = 300
b[3] = 200
b[4] = 100

b[0] = 1
b[1] = 2
b[2] = 3
b[3] = 4
b[4] = 5

결과를 보면, 4번 b = a // ❹ a 배열을 b변수에 복사 해당 부분에서


좌변에 있는 배열 b 에 우변에 있는 배열 a 를 복사한 것을 알 수 있습니다.


이와 같이 좌변은 복사 받는 배열, 우변은 복사하는 배열 인 것을 알 수 있습니다.


다만 여기서 주의해야 할 점이, 두 배열 모두 같은 타입이여야 합니다.


예를 들어,

var a = [5]int{1, 2, 3, 4, 5}
var b = [5]float32{100, 200, 300, 400, 500}

b = a
---
이렇게 하면 배열 복사 과정에서 에러가 나옵니다.

다중 배열

다중 배열은 중첩된 배열을 말합니다. 이중 배열, 삼중 배열 처럼 여러 번 중첩해서 사용할 수 있습니다.


간단하게, 다중 배열은 배열을 요소로 가지는 배열이라고 이해하면 쉽습니다.


위 이미지는 다중 배열을 보여주는 사진 입니다.

var b [2][6]int 

즉 배열 b는 [6]int 배열이 2개가 있는 다중 배열이라고 이해하시면 됩니다.

따라서 다중 배열은 배열이 몇 개가 중첩됐든 [개수]타입 형태로 이해하시면 됩니다.

ex) var a [2][5][100][200]int 

[개수]타입 형태로 이해한다는 뜻이 무슨 말이냐면,

1. 다중 배열 a는 [5][100][200]int 타입을 2개 가진 배열 입니다.
2. 다시 대중 배열 a는 [100][200]int 타입을 5개 가진 배열 입니다.
3. 다시 다중 배열 a는 [200]int 타입을 100개 가진 배열 입니다.

즉, a 는 2 * 5 * 100 * 200 크기를 가진 4차원(4중) 배열 입니다.

이런식으로 하나씩 배열을 풀어가면 됩니다.

예시를 통해 다중 배열을 어떻게 사용하는 지 알아 보겠습니다.

//ch10/ex10.6/ex10.6.go
package main

import "fmt"

func main() {
    a := [2][5]int{             // ❶ 이중 배열 선언
        {1, 2, 3, 4, 5},
        {5, 6, 7, 8, 9},         // ❷ 여러 줄에 걸쳐 초기화할 때는 쉼표를 찍자!
    }
    for _, arr := range a {     // ❸ arr값은 순서대로 a[0]의 배열 a[1]의 배열
        for _, v := range arr { // ❹ v값은 순서대로 a[0]과 a[1] 배열의 각 원소
            fmt.Print(v, " ")     // ➎ v값 출력
        }
        fmt.Println()
    }
}
---
1 2 3 4 5 
5 6 7 8 9 

여기서 a는 배열 요소가 5개씩 들어가는 배열 2개를 가진 이중 배열 입니다.


따라서 위 코드에서 나온 것 처럼 이중 배열을 선언해주면 됩니다.


그리고 for 문을 보면, 첫번째 for문 보면, arrrange a 로부터 순서대로 a[0], a[1] 배열을 받고,


두번째 for문을 보면, a[0], a[1] 배열 안에 있는 배열 요소 값들을 차례로 보여줍니다.




이상 입니다.


감사합니다.

반응형