[Golang] 배열(Array)

2021-10-18 hit count image

Golang에서 배열(Array)를 정의하고 사용하는 방법에 대해서 알아봅시다.

개요

이번 블로그 포스트에서는 Golang에서 array(배열)를 사용하여 변수를 선언하고 사용하는 방법에 대해서 살펴보려고 합니다. 이 블로그 포스트에서 소개하는 코드는 다음 링크를 통해 확인하실 수 있습니다.

배열

Golang에서 배열은 같은 데이터 타입에 데이터들을 저장하기 위한 타입으로써, 연속된 메모리에 데이터가 저장됩니다. 배열은 다음과 같이 선언하여 사용할 수 있습니다.

var 변수명 [요소 개수]타입
var a [5]int

다음과 같이 배열은 선언한 경우, 크기가 5이며 int형 값을 저장하는 배열이 생성되고, 초기값이 선언되지 않았기 때문에, int의 기본값인 0이 할당되게 됩니다.

var a [5]int

배열 선언시 배열의 크기는 상수만 사용이 가능하며, 변수를 사용한 경우 컴파일 오류가 발생합니다.

const LEN = 5
var a = [LEN]int

// Error
len := 5
var b := [len]int

이를 확인한기 위해 main.go 파일을 생성하고 다음과 같이 수정합니다.

package main

import "fmt"

func main() {
  var a [5]int
  fmt.Println(a)

  const LEN = 5
  var b [LEN]int
  fmt.Println(b)

  // ERROR
  // var len = 5
  // var c [len]int
  // fmt.Println(c)
}

위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

# go run main.go
[0 0 0 0 0]
[0 0 0 0 0]

초기값

Golang에서 배열은 다음과 같이 변수를 선언할 때, 초기값을 설정할 수 있습니다.

var a [5]int = [5]int{1, 2, 3, 4, 5}
// [1 2 3 4 5]
var a = [5]int{1, 2, 3, 4, 5}
// [1 2 3 4 5]

배열도 변수 할당이므로 다음과 같이 선언 대입문을 사용할 수 있습니다.

days := [3]string{"Mon", "Tue", "Wed"}
// [Mon Tue Wed]

초기값은 다음과 같이 일부만 설정할 수 있으며, 초기값이 설정되지 않은 부분은 변수 타입의 기본값이 설정되게 됩니다.

a := [5]int{1, 2}
// [1 2 0 0 0]

다음과 같이 특정 위치에만 초기값을 설정할 수도 있습니다.

a := [5]int{1: 10, 3: 30}
// [0 10 0 30 0]

다음과 같이 초기값을 선언하면 길이가 초기값의 크기와 동일한 배열이 생성됩니다.

a := [...]int{1, 2, 3, 4, 5}
// [5]int
// [1 2 3 4 5]

다음과 같이 사용한 경우, 길이가 고정되지 않은 slice가 생성되게 됩니다. (배열이 아님)

a := []int{1, 2, 3, 4, 5}
// []int
// [1 2 3 4 5]

이를 확인하기 위해 main.go 파일을 다음과 같이 수정합니다.

package main

import "fmt"

func main() {
  var a [5]int = [5]int{1, 2, 3, 4, 5}
  fmt.Println(a)

  var b = [5]int{1, 2, 3, 4, 5}
  fmt.Println(b)

  days := [3]string{"Mon", "Tue", "Wed"}
  fmt.Println(days)

  e := [5]int{1, 2}
  fmt.Println(e)

  f := [5]int{1: 10, 3: 30}
  fmt.Println(f)

  g := [...]int{1, 2, 3, 4, 5}
  fmt.Printf("%T\n", g)
  fmt.Println(g)

  h := []int{1, 2, 3, 4, 5}
  fmt.Printf("%T\n", h)
  fmt.Println(h)
}

이를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

[1 2 3 4 5]
[1 2 3 4 5]
[Mon Tue Wed]
[1 2 0 0 0]
[0 10 0 30 0]
[5]int
[1 2 3 4 5]
[]int
[1 2 3 4 5]

배열 복사

배열은 일반 변수를 복사하는 것과는 다릅니다.

a := [...]int{1, 2, 3, 4, 5}
b := [...]int{10, 20, 30, 40, 50}

fmt.Println(a)
fmt.Println(b)

b = a
fmt.Println(a)
fmt.Println(b)

위에 예제를 살펴보면 다음과 같은 코드를 통해 배열을 복사합니다.

b = a

배열 복사는 a의 메모리 크기만큼을 b에 복사하게 됩니다. 배열은 연속된 메모리에 데이터가 저장되므로 ab에 복사할 때, 값 하나하나를 복사하는 것이 아니라 메모리를 통째로 복사하게 됩니다.

따라서 배열의 크기가 다르면 복사를 할 수 없습니다. Golang은 기본적으로 양변의 타입이 같아야 복사가 가능합니다. 따라서 다음과 같이 [3]int 타입의 배열을 [5]int 배열에 복사할 수 없습니다.

c := [3]int{1, 2, 3}
d := [5]int{10, 20, 30, 40, 50}

// ERROR
d = c
fmt.Println(c)
fmt.Println(d)

다차원 배열

Golang에서도 다차원 배열을 사용할 수 있습니다.

var a [2][5]int

기본 배열 사용법과 동일하게, 배열을 선언하면서 초기값을 설정할 수 있습니다.

package main

import "fmt"

func main() {
  a := [2][5]int{
    {1, 2, 3, 4, 5},
    {10, 20, 30, 40, 50},
  }

  for _, arr := range a {
    for _, v := range arr {
      fmt.Print(v, " ")
    }
    fmt.Println()
  }
}

위에 내용을 실행해 보면 다음과 같은 결과를 얻을 수 있습니다.

# go run main.go
1 2 3 4 5
10 20 30 40 50

완료

이것으로 Golang에서 배열을 정의하고 사용하는 방법에 대해서 살펴보았습니다. 또한, 배열을 복사하기 위해서는 동일한 타입과 크기의 배열을 사용해야 된다는 점에 대해서도 알게 되었습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

책 홍보

스무디 한 잔 마시며 끝내는 React Native 책을 출판한지 벌써 2년이 다되었네요.
이번에도 좋은 기회가 있어서 스무디 한 잔 마시며 끝내는 리액트 + TDD 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
Posts