일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- go언어
- mutex
- channel
- http
- range
- install
- C
- 리뷰
- bitcoin
- Linux
- window
- FOR
- File
- json
- c++
- Golang
- Sync
- go
- package
- Callback
- Close
- windows
- Python
- 영화
- API
- write
- GO 언어
- tcp
- JavaScript
- 책
- Today
- Total
Code Habit
Go ) 슬라이스 본문
슬라이스는 배열과 같지만 길이가 고정되어 있지 않고 동적으로 크기가 늘어난다. 또한, 배열과는 달리 레퍼런스 타입이다.
- var 슬라이스명 []자료형
var a []int // int형 슬라이스 선언
슬라이스는 배열과 달리 [](대괄호) 안에 길이를 지정하지 않는다. 이렇게 생성된 슬라이스의 길이는 0이다.
슬라이스는 make 함수를 사용하여 공간을 할당해야 값을 넣을 수 있다.
var a []int = make([]int, 5) // make 함수로 int 형에 길이가 5인 슬라이스에 공간 할당
var b = make([]int, 5) // 슬라이스를 선언할 때 자료형과 [] 생략
c := make([]int, 5) // 슬라이스를 선언할 때 var 키워드, 자료형과 [] 생략
슬라이스를 생성하고 공간을 할당하면 슬라이스의 요소는 모두 0으로 초기화된다.
슬라이스를 생성하면서 값을 초기화하려면 {} (중괄호)를 사용한다.
a := []int{32, 29, 78, 16, 81}
b := []int {
32,
29,
78,
16,
81,
}
실제 슬라이스는 배열을 내장하고 있는데, 이 배열이 더 늘어났을 때 사용할 공간을 미리 할당할 수 있다.
- make([]자료형, 길이, 용량)
var s = make([]int, 5, 10) // 길이가 5이고 용량이 10인 슬라이스 생성
슬라이스 길이는 용량보다 크게 설정할 수 없다. 또한 용량을 생략하면 용량은 길이와 동일하게 설정된다.
- 길이 : 인덱스로 접근할 수 있는 공간이다. (슬라이스 내부 배열의 최대 길이). 용량이 더 확보되어 있더라도 길이 이상의 인덱스에 접근하면 런타임 에러가 발생한다.
- 용량 : 실제 메모리에 할당된 공간이다. 만약 슬라이스에 요소를 추가하여 용량이 가득차면 용량은 자동으로 늘어난다.
※ 미리 슬라이스의 용량을 크게 할당하면 요소가 추가될 때마다 메모리를 새로 할당하지 않아도 되므로 성능상 이점이 있다. 하지만, 처음부터 메모리 공간을 많이 차지하는 단점이 있다.
슬라이스의 길이는 len 함수, 용량은 cap 함수로 구할 수 있다.
a := make([]int, 5, 10)
fmt.Println(len(a)) // 길이는 5
fmt.Println(cap(a)) // 용량은 10
단 용량이 길이보다 크더라도 길이를 벗어난 인덱스에는 접근할 수 없다.
a := make([]int, 5, 10)
fmt.Println(a[4]) // 0 : make 함수를 사용하면 슬라이스의 요소는 모두 0으로 초기화
fmt.Println(a[5]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
fmt.Println(a[8]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
append 함수를 사용하면 슬라이스의 맨 뒤에 값을 추가할 수 있다.
- append(슬라이스, 값1, 값2, 값3)
a := []int{1, 2, 3}
a = append(a, 4, 5, 6)
fmt.Println(a) // [1 2 3 4 5 6]
슬라이스에 다른 슬라이스를 붙이려면 append 함수를 사용할 때 ...을 사용한다.
a := []int{1, 2, 3}
b := []int{4, 5, 6}
a = append(a, b...) // 슬라이스 a에 슬라이스 b를 붙일 때는 b...을 씀
fmt.Println(a) // [1 2 3 4 5 6]
append 함수는 가변인자 함수이므로 ...을 사용하여 슬라이스에 들어 있는 요소를 각각 넘겨준다. ...은 가변인자 함수를 만들 때도 사용할 수 있고 가변인자 함수에 값을 넘겨줄 때도 사용할 수 있다.