※ 개요
- 고정 크기 또는 가변 크기?
- 크기가 타입의 일부인가?
- 다차원 배열은 어떻게 생겼나?
- 빈 배열은 의미가 있는가?
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)
- 고정 크기: 선언 시 크기가 고정되며, 변경할 수 없습니다. 배열의 크기는 타입의 일부로 간주되며, 다른 크기의 배열은 서로 다른 타입으로 취급됩니다.
- 값 타입: 배열은 값 타입이므로 복사하거나 함수에 전달할 때 전체 배열이 복사됩니다. 이를 통해 원본 데이터의 변경을 방지할 수 있습니다.
- 초기화: 배열은 선언 시 모든 요소가 기본값(제로값)으로 초기화됩니다. 초기화 방법에는 전체 초기화, 부분 초기화, 길이 추론, 인덱스를 사용한 초기화 등이 있습니다.
- 다차원 배열: 배열은 여러 차원의 배열로 선언할 수 있으며, 각 요소는 특정 인덱스를 통해 접근할 수 있습니다.
슬라이스 (Slices)
- 동적 크기: 슬라이스의 길이는 실행 시간에 변경될 수 있습니다. 슬라이스는 배열과 달리 크기가 유연하여 다양한 상황에 적합합니다.
- 참조 타입: 슬라이스는 내부적으로 배열을 참조하며, 복사 시 참조만 복사됩니다. 이는 데이터 공유와 효율적인 메모리 사용을 가능하게 합니다.
- 구성 요소: 슬라이스는 포인터, 길이, 용량으로 구성됩니다. 포인터는 슬라이스가 참조하는 배열의 시작점을 가리킵니다.
- 초기화: 슬라이스는 make 함수, 배열로부터 생성, 리터럴을 통해 초기화할 수 있습니다.
- 다차원 슬라이스: 다차원 슬라이스는 슬라이스의 슬라이스로 표현되며, 동적 크기와 유연한 구조를 가집니다.
- nil 슬라이스와 빈 슬라이스: nil 슬라이스는 길이와 용량이 0이며, 내부 포인터는 nil입니다. 반면, 빈 슬라이스는 nil이 아니며, 실제 메모리를 할당받습니다.
시리즈
Golang Arrays(배열), Slice(슬라이스) - 선언, 초기화 방법
Golang Slice(슬라이스) : make, copy, append
참고
'프로그래밍 > Golang' 카테고리의 다른 글
Golang Slice(슬라이스) 요소 제거하기 (0) | 2024.07.31 |
---|---|
Golang Slice(슬라이스) : make, copy, append (0) | 2024.07.31 |
Golang Interface - 빈 인터페이스 (interface{}) (0) | 2024.07.27 |
Golang Interface - 암시적 인터페이스: 코드 유연성과 재사용성 (0) | 2024.07.27 |
Golang Interface 최적화: 인터페이스 불필요한 추상화 피하고 테스트 용이성 높이기 (0) | 2024.07.27 |