연습 - 배열 사용

완료됨

Go의 배열은 특정 형식의 고정 길이 데이터 구조입니다. 배열에는 0 개 이상의 요소가 포함될 수 있으며 선언하거나 초기화할 때 크기를 정의해야 합니다. 또한 ‘만든 후에는 크기를 조정할 수 없습니다.’. 이러한 이유로, 배열은 일반적으로 Go 프로그램에서 사용되지 않지만 조각 및 맵의 토대가 됩니다.

배열 선언

Go에서 배열을 선언하려면 해당 요소의 데이터 형식과 배열에 포함될 수 있는 요소의 수를 정의해야 합니다. 그런 후에는 아래 첨자 표기법을 사용하여 배열의 각 요소에 액세스할 수 있습니다. 여기서 0은 첫 번째 요소이고 마지막 요소는 배열 길이보다 1이 더 작습니다(길이 - 1).

예를 들어, 다음 코드를 사용하겠습니다.

package main

import "fmt"

func main() {
    var a [3]int
    a[1] = 10
    fmt.Println(a[0])
    fmt.Println(a[1])
    fmt.Println(a[len(a)-1])
}

위의 코드를 실행하면 다음과 같이 출력됩니다.

0
10
0

배열을 선언한 경우에도 해당 요소에 액세스할 때 오류가 발생하지 않습니다. 기본적으로 Go는 기본 데이터 형식을 사용하여 각 요소를 초기화합니다. 이 경우 int의 기본값은 0입니다. 그러나 a[1] = 10에서와 마찬가지로 특정 위치에 값을 할당할 수 있습니다. 동일한 표기법을 사용하여 해당 요소에 액세스할 수 있습니다. 또한 a[0]을 사용하여 첫 번째 요소를 참조합니다. 마지막 요소를 참조하기 위해 a[len(a)-1]을 사용했습니다. len 함수는 배열, 조각 또는 맵의 요소 수를 가져오기 위한 Go의 기본 제공 함수입니다.

배열 초기화

배열을 선언할 때 기본값이 아닌 다른 값을 사용하여 배열을 초기화할 수도 있습니다. 예를 들어, 다음 코드를 사용하여 구문을 확인하고 테스트할 수 있습니다.

package main

import "fmt"

func main() {
    cities := [5]string{"New York", "Paris", "Berlin", "Madrid"}
    fmt.Println("Cities:", cities)
}

위의 코드를 실행하면 다음과 같은 출력이 표시됩니다.

Cities: [New York Paris Berlin Madrid ]

배열에 5개의 요소가 있어야 하지만 모든 요소에 값을 할당할 필요는 없습니다. 앞에서 살펴본 것처럼 최신 위치는 문자열 데이터 형식의 기본값인 빈 문자열을 포함합니다.

배열의 줄임표

필요한 위치 수를 모르지만 데이터 요소 집합은 알고 있는 경우 배열을 선언하고 초기화하는 또 다른 방법은 다음과 같이 줄임표(...)를 사용하는 것입니다.

q := [...]int{1, 2, 3}

줄임표를 사용하도록 이전 섹션에서 사용한 프로그램을 수정하겠습니다. 파일은 다음 예와 같이 표시됩니다.

package main

import "fmt"

func main() {
    cities := [...]string{"New York", "Paris", "Berlin", "Madrid"}
    fmt.Println("Cities:", cities)
}

위의 코드를 실행하면 다음 예제와 같이 유사한 출력이 표시됩니다.

Cities: [New York Paris Berlin Madrid]

차이점을 알 수 있나요? 끝에 빈 문자열이 없습니다. 배열 길이는 초기화할 때 입력한 문자열에 의해 결정됩니다. 필요할지 여부를 잘 모르는 메모리는 예약하지 않도록 합니다.

배열을 초기화하는 또 다른 흥미로운 방법은 줄임표를 사용하고 최신 위치에 대해서만 값을 지정하는 것입니다. 예를 들어 다음 코드를 사용합니다.

package main

import "fmt"

func main() {
    numbers := [...]int{99: -1}
    fmt.Println("First Position:", numbers[0])
    fmt.Println("Last Position:", numbers[99])
    fmt.Println("Length:", len(numbers))
}

이 코드를 실행하면 다음과 같은 출력이 표시됩니다.

First Position: 0
Last Position: -1
Length: 100

99번째 위치에 대한 값을 지정했으므로 어떻게 배열 길이가 100이 될 것인지 알 수 있습니다. 첫 번째 위치는 기본값(0)을 출력합니다.

다차원 배열

Go는 복잡한 데이터 구조를 사용해야 하는 경우 다차원 배열을 지원합니다. 2차원 배열을 선언하고 초기화하는 프로그램을 만들어 보겠습니다. 다음 코드를 사용합니다.

package main

import "fmt"

func main() {
    var twoD [3][5]int
    for i := 0; i < 3; i++ {
        for j := 0; j < 5; j++ {
            twoD[i][j] = (i + 1) * (j + 1)
        }
        fmt.Println("Row", i, twoD[i])
    }
    fmt.Println("\nAll at once:", twoD)
}

위의 프로그램을 실행하면 다음 예제와 같은 출력이 표시됩니다.

Row 0 [1 2 3 4 5]
Row 1 [2 4 6 8 10]
Row 2 [3 6 9 12 15]

All at once: [[1 2 3 4 5] [2 4 6 8 10] [3 6 9 12 15]]

var twoD [3][5]int와 같이 배열이 2차원에서 포함하게 될 위치 수를 지정하는 2차원 배열을 선언했습니다. 이 배열은 스프레드시트나 행렬처럼 열 및 행이 있는 하나의 데이터 구조로 생각할 수 있습니다. 이때 모든 위치의 기본값은 0입니다. for 루프에서는 모든 행에서 다른 값 패턴을 사용하여 모든 위치를 초기화합니다. 마지막으로 모든 값을 터미널에 출력합니다.

3차원 배열을 선언하려면 어떻게 해야 하나요? 구문이 무엇인지 짐작할 수 있습니다. 그렇죠? 이 작업은 다음 예제와 같이 수행할 수 있습니다.

package main

import "fmt"

func main() {
    var threeD [3][5][2]int
    for i := 0; i < 3; i++ {
        for j := 0; j < 5; j++ {
            for k := 0; k < 2; k++ {
                threeD[i][j][k] = (i + 1) * (j + 1) * (k + 1)
            }
        }
    }
    fmt.Println("\nAll at once:", threeD)
}

위의 코드를 실행하면 다음 예제와 같은 출력이 표시됩니다.

All at once: [[[1 2] [2 4] [3 6] [4 8] [5 10]] [[2 4] [4 8] [6 12] [8 16] [10 20]] [[3 6] [6 12] [9 18] [12 24] [15 30]]]

출력 형식을 좀 더 읽기 쉬운 형식으로 지정하는 경우 이 예제와 같은 결과를 얻을 수 있습니다.

All at once: 
[
    [
        [1 2] [2 4] [3 6] [4 8] [5 10]
    ] 
    [
        [2 4] [4 8] [6 12] [8 16] [10 20]
    ] 
    [
        [3 6] [6 12] [9 18] [12 24] [15 30]
    ]
]

구조체가 2차원 배열에서 어떻게 달라지는지 확인합니다. 필요한 만큼 더 많은 차원을 계속 사용할 수 있지만, 다른 데이터 형식도 살펴보아야 하므로 지금은 여기까지만 진행하겠습니다.