본문 바로가기
프로그래밍/Golang

Golang Arrays(배열), Slice(슬라이스) - 선언, 초기화 방법

by slowin 2024. 7. 31.

개요

  • 고정 크기 또는 가변 크기?
  • 크기가 타입의 일부인가?
  • 다차원 배열은 어떻게 생겼나?
  • 빈 배열은 의미가 있는가?

Golang 개발팀은 위의 질문에 대한 답을 찾기위해 1년이 걸렸다고 합니다. 앞으로의 포스팅을 통해 Arrays(배열), Slice(슬라이스)에 대해 기본부터 특성 사용법까지 알아 보도록 하겠습니다.

참고링크: 배열, 슬라이스(및 문자열)(go.dev)

 

Arrays(배열)

배열은 동일한 타입의 요소들을 연속된 메모리 공간에 저장하는 데이터 구조입니다.

  • 주요특징
    • 고정 크기: Go의 배열은 선언 시 크기가 고정되며, 이는 변경할 수 없습니다.
    • 타입의 일부: 배열의 크기는 타입의 일부입니다. 즉, [5]int와 [10]int는 서로 다른 타입입니다.
    • 값 타입: Go에서 배열은 값 타입입니다. 이는 배열을 복사하거나 함수에 전달할 때 전체 배열이 복사됨을 의미합니다.

1. Arrays(배열) 선언 방법

1.1 기본 선언

var a [5]int

선언된 배열은 모든 요소가 해당 타입의 제로값(int의 경우 0)으로 초기화됩니다.

1.2 선언과 동시에 초기화

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

모든 요소를 명시적으로 초기화합니다.

1.3 부분 초기화

b := [5]int{1, 2, 3}

명시되지 않은 요소는 제로값으로 초기화됩니다. (b는 [1, 2, 3, 0, 0]이 됩니다)

1.4 길이 추론

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

`...` 를 사용하면 컴파일러가 초기화된 요소의 수를 세어 배열의 길이를 결정합니다.

1.5 인덱스를 사용한 초기화

d := [5]int{0: 3, 2: 5, 4: 7}

특정 인덱스의 값만 초기화할 수 있습니다. (d는 [3, 0, 5, 0, 7]이 됩니다)

 

2. Arrays(배열) 주의사항

2.1 타입 컴파일 에러

Go에서 Arrays(배열)의 길이는 타입의 일부입니다. 즉, [3]int와 [5]int는 서로 다른 타입입니다.

var a [3]int
var b [5]int
// 컴파일 에러! 
//cannot use b (variable of type [5]int) as [3]int value in assignment
a = b

 

2.2 초기화 없는 선언

짧은 변수 선언 :=을 사용할 때는 반드시 초기값을 제공해야 합니다.

a := [5]int // 컴파일 에러!

# 올바른 방법
a := [5]int{}

 

3. 다차원 Arrays(배열)

matrix := [3][4]int{
    {0, 1, 2, 3},
    {4, 5, 6, 7},
    {8, 9, 10, 11},
}

이 예시에서 matrix는 3개의 행과 4개의 열을 가진 2차원 정수 배열입니다.

 

값 접근은 아래와 같이 합니다.

element := matrix[1][2]  // 6을 반환

※ Slice(슬라이스)

슬라이스는 Go 언어에서 배열과는 다르게 유연한 데이터 구조입니다.

  • 주요특징
    • 동적 크기: 슬라이스의 길이는 실행 시간에 변경될 수 있습니다.
    • 참조 타입: 슬라이스는 내부적으로 배열을 참조합니다. 슬라이스를 복사할 때는 참조만 복사됩니다.
    • 세 가지 구성 요소: 포인터(배열의 특정 요소를 가리킴), 길이, 용량으로 구성됩니다.

1. Slice(슬라이스) 선언 및 초기화

1.1 기본 선언

var s []int

이렇게 선언된 슬라이스는 nil 슬라이스입니다.

 

1.1 make 함수를 사용한 선언

s := make([]int, 5)    // 길이와 용량이 5인 슬라이스
s := make([]int, 5, 10) // 길이가 5, 용량이 10인 슬라이스

 

1.2 리터럴을 사용한 초기화

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

1.3 배열로부터 Slice(슬라이스) 생성

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

 

2. 다차원 Slice(슬라이스)

2.1 2차원 Slice(슬라이스) 선언

선언 방법

var matrix [][]int

2.2 make를 사용한 초기화

3x4 크기의 2차원 슬라이스를 생성하는방법.

matrix := make([][]int, 3)
for i := range matrix {
    matrix[i] = make([]int, 4)
}

 

2.3 리터럴을 사용한 초기화

matrix := [][]int{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12},
}

 

정리

배열 (Arrays)

  1. 고정 크기: 선언 시 크기가 고정되며, 변경할 수 없습니다. 배열의 크기는 타입의 일부로 간주되며, 다른 크기의 배열은 서로 다른 타입으로 취급됩니다.
  2. 값 타입: 배열은 값 타입이므로 복사하거나 함수에 전달할 때 전체 배열이 복사됩니다. 이를 통해 원본 데이터의 변경을 방지할 수 있습니다.
  3. 초기화: 배열은 선언 시 모든 요소가 기본값(제로값)으로 초기화됩니다. 초기화 방법에는 전체 초기화, 부분 초기화, 길이 추론, 인덱스를 사용한 초기화 등이 있습니다.
  4. 다차원 배열: 배열은 여러 차원의 배열로 선언할 수 있으며, 각 요소는 특정 인덱스를 통해 접근할 수 있습니다.

슬라이스 (Slices)

  1. 동적 크기: 슬라이스의 길이는 실행 시간에 변경될 수 있습니다. 슬라이스는 배열과 달리 크기가 유연하여 다양한 상황에 적합합니다.
  2. 참조 타입: 슬라이스는 내부적으로 배열을 참조하며, 복사 시 참조만 복사됩니다. 이는 데이터 공유와 효율적인 메모리 사용을 가능하게 합니다.
  3. 구성 요소: 슬라이스는 포인터, 길이, 용량으로 구성됩니다. 포인터는 슬라이스가 참조하는 배열의 시작점을 가리킵니다.
  4. 초기화: 슬라이스는 make 함수, 배열로부터 생성, 리터럴을 통해 초기화할 수 있습니다.
  5. 다차원 슬라이스: 다차원 슬라이스는 슬라이스의 슬라이스로 표현되며, 동적 크기와 유연한 구조를 가집니다.
  6. nil 슬라이스와 빈 슬라이스: nil 슬라이스는 길이와 용량이 0이며, 내부 포인터는 nil입니다. 반면, 빈 슬라이스는 nil이 아니며, 실제 메모리를 할당받습니다.

시리즈

Golang Arrays(배열), Slice(슬라이스) - 선언, 초기화 방법

Golang Slice(슬라이스) 동작원리와 사용법

Golang Slice(슬라이스) : make, copy, append

Golang Slice(슬라이스) 요소 제거하기

참고

Arrays, slices (and strings): The mechanics of 'append'