2. 슬라이스 사용하기
페이지 정보
작성자 관리자 댓글 0건 조회 2,988회 작성일 19-03-11 21:08본문
2. 슬라이스 사용하기
슬라이스는 배열과 같지만, 길이가 고정되어 있지 않으며 동적으로 크기가 늘어난다.
배열과 달리 레퍼런스 타입이다.
var 슬라이스명 []자료형
슬라이스는 배열과 달리 [](대괄호)안에 길이를 지정하지 않는다. 이렇게 생성된 슬라이스의 길이는 0이다.
슬라이스는 make 함수를 사용하여 공간을 할댕해야 값을 넣을 수 있다.
슬라이스 선언과 동시에 make 함수를 사용하면 대괄호와 자료형은 생략할 수 있다.
일반변수와 마찬가지로 :=를사용하여 var를 생략할 수 있다.
make([]자료형, 길이)
package main
import "fmt"
func main() {
var a []int = make([]int, 5) // make 함수로 int형에 길이가 5인 슬라이스에 공간 할당
var b = make([]int, 5) // 슬라이스를 선언할 때 자료형과 [] 생략
c := make([]int, 5) // 슬라이스를 선언할 때 var 키워드, 자료형과 [] 생략
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
}
슬라이스를 생성하고 공간을 할당하면 슬라이스의 요소는 모두 0으로 초기화된다.
package main
import "fmt"
func main() {
a := []int{32, 29, 78, 16, 81} // 슬라이스를 생성하면서 값을 초기화
b := []int{
32,
29,
78,
16,
81, // 여러 줄로 나열할 때는 마지막 요소에 콤마를 붙임
}
fmt.Println(a)
fmt.Println(b)
}
슬라이스는 배열을 내장하고 있는데, 이 배열이 더 늘어났을 때 사용할 공간을 미리 할당할 수 있다.
make([]자료형, 길이, 용량)
package main
import "fmt"
func main() {
a := make([]int, 5, 10) // 길이가 5이고 용량이 10인 슬라이스 생성
fmt.Println(len(a)) // 길이는 5
fmt.Println(cap(a)) // 용량은 10
}
package main
import "fmt"
func main() {
a := make([]int, 5, 10) // 길이가 5이면 a[0], a[1], a[2], a[3], a[4]가 생성
fmt.Println(a[4]) // 0: make 함수를 사용하면 슬라이스의 요소는 모두 0으로 초기화
fmt.Println(a[5]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
fmt.Println(a[8]) // 길이를 벗어난 인덱스에 접근했으므로 런타임 에러 발생
}
1. 슬라이스에 값 추가하기
append(슬라이스, 값1, 값2, 값3)
append 함수를 사용하면 슬라이스의 맨뒤에 값을 추가할 수 있다.
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
a = append(a, 4, 5, 6)
fmt.Println(a) // [1 2 3 4 5 6]
}
슬라이스에 다른 슬라이스를 붙이려면 append 함수를 사용할 때 ...을 사용한다.
package main
import "fmt"
func main() {
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함수는 가변인자 함수이므로 ...을 사용하여 슬라이스에 들어 있는 요소를 각각 넘겨준다.
...은 가변인자 함수를 만들때도 사용할 수 있고 가변인자 함수에 값을 넘겨줄때도 사용할 수 있다.
2. 레퍼런스 타입
슬라이스는 레퍼런스 타입이다.
내장된 배열에 대한 포인터이므로 슬라이스끼리 대입하면 값이 복사되지 않고 참조만 한다.
package main
import "fmt"
func main() {
a := [3]int{1, 2, 3}
var b [3]int
b = a // 배열의 요소가 모두 복사됨
b[0] = 9 // b[0]에 9를 대입하면 b의 첫 번째 요소만 바뀜
fmt.Println(a) // [1 2 3]
fmt.Println(b) // [9 2 3]
}
슬라이스를 만들고, 대입해 본다.
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
var b []int // 슬라이스로 선언
b = a // a를 b에 대입해도 요소가 모두 복사되지 않고 참조만 함
b[0] = 9 // 슬라이스는 참조이므로 a[0], b[0]의 값이 모두 바뀜
fmt.Println(a) // [9 2 3]
fmt.Println(b) // [9 2 3]
}
3. 슬라이스 복사하기
슬라이스의 요소를 모두 복사할 때는 copy 함수를 사용한다.
copy(복사될 슬라이스, 원본 슬라이스)
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
b := make([]int, 3) // make 함수로 공간을 할당
copy(b, a) // 슬라이스 a의 요소를 슬라이스 b에 복사
fmt.Println(a) // [1 2 3 4 5]
fmt.Println(b) // [1 2 3]: 슬라이스 b의 길이는 3이므로 a의 요소 3개만 복사됨
}
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := make([]int, 3)
copy(b, a) // 슬라이스를 복사하였으므로
b[0] = 9 // b[0]만 바뀌고, a[0]은 바뀌지 않음
fmt.Println(a) // [1 2 3]
fmt.Println(b) // [9 2 3]
}
4. 슬라이스와 용량
슬라이스는 길이를 동작으로 늘릴 수 있다.
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
fmt.Println(len(a), cap(a)) // 5 5: 길이가 5이며 용량이 5인 슬라이스
a = append(a, 6, 7) // 슬라이스 a에 값 6, 7을 추가
fmt.Println(len(a), cap(a)) // 7 10: 길이가 7이며 용량이 10인 슬라이스, 용량이 늘어남!
}
5. 부분 슬라이스 만들기
슬라이스는 기존 슬라이스에서 일정 위치를 지정하여 부분 슬라이스를 만들 수 있다.
슬라이스[시작인덱스:끝인덱스]
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
b := a[0:5] // a의 인덱스 0부터 5까지 참조
fmt.Println(a) // [1 2 3 4 5]
fmt.Println(b) // [1 2 3 4 5]
}
시작인덱스와 끝 인덱스를 설정하여 일부만 참조한다.
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
fmt.Println(a[0:3]) // [1 2 3]
fmt.Println(a[1:3]) // [2 3]
fmt.Println(a[2:5]) // [3 4 5]
}
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5}
fmt.Println(a[:]) // [1 2 3 4 5]
fmt.Println(a[0:]) // [1 2 3 4 5]
fmt.Println(a[:5]) // [1 2 3 4 5]
fmt.Println(a[0:len(a)]) // [1 2 3 4 5]
fmt.Println(a[3:]) // [4 5]
fmt.Println(a[:3]) // [1 2 3]
fmt.Println(a[1:3]) // [2 3]
}
슬라이스[시작인덱스:끝인덱스:용량]
부분 슬라이스를 만들면서 용량도 지정할 수 있다.
package main
import "fmt"
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8}
b := a[0:6:8] // 인덱스 0부터 6까지 가져와서 부분 슬라이스로 만들고 용량을 8로 설정
fmt.Println(len(b), cap(b)) // 6 8: 길이가 6이며 용량이 8인 슬라이스
fmt.Println(b) // [1 2 3 4 5 6]
}
댓글목록
등록된 댓글이 없습니다.