목차
Slice 정의
Slice 생성 방법1 - []datatype{values} 구문 이용
Slice 생성 방법2 - Array 이용
Slice 생성 방법3 - make() 함수 이용
Slice 요소 접근
Slice 요소 변경
Slice 요소 추가 - append()함수
Slice 결합 연결 - append()함수
Slice 길이 변경
Slice 메모리 효율성 - copy() 함수
Slice 정의
1.
슬라이스는 배열과 유사하지만 더 강력하고 유연.
배열과 유사점: 단일 변수에 동일 유형의 여러 값 저장 가능.
배열과 차이점: 길이를 원하는 대로 늘리거나 줄일 수 있음 .
2.
슬라이스 만드는 방법 3가지
방법1 - []datatype{values} 구문 이용
방법2 - Array 이용
방법3 - make() 함수 이용
Slice 생성 방법1 - []datatype{values} 구문 이용
[구문]
slice_name := []datatype {values }
[예제]
hz := []int
길이가 0이고, 용량이 0인 빈 슬라이스 선언.
hz := []int{1,2,3}
길이가 3이고, 용량이 3인 슬라이스 선언.
[len() 함수 vs cap() 함수]
len() 함수
슬라이스의 길이 (= length) 반환. ※ 슬라이스의 요소 개수 의미.
cap() 함수
슬라이스의 용량 (= capacity) 반환.
※ 슬라이스가 늘어나거나 줄어들 수 있는 요소 개수 의미.
※ 요소 추가 시, 자동으로 늘어나는 공간. (= 실제 메모리에 할당된 공간)
※ 용량 >= 길이
[예제]
package main
import ("fmt")
func main() {
a := []int{}
fmt.Println(len(a) ) // 0
fmt.Println(cap(a) ) // 0
fmt.Println(a ) // []
b := []string{"HTML", "CSS", "JS", "GO"}
fmt.Println(len(b) ) // 4
fmt.Println(cap(b) ) // 4
fmt.Println(b ) // [HTML CSS JS GO]
}
Slice 생성 방법2 - Array 이용
배열 잘라서 slice 생성 가능.
[구문]
var myarray = [length ]datatype {values } // 배열
myslice := myarray [start_index :end_index ] // 배열로 슬라이스 생성
※ end_index 의 값은 포함 X
[예제]
package main
import ("fmt")
func main() {
hzarray := [6]int{0,1,2,3,4,5}
hzslice := hzarray[2:4]
fmt.Printf("hzslice = %v\n", hzslice ) // hzslice = [2 3]
fmt.Printf("length = %d\n", len(hzslice) ) // length = 2
fmt.Printf("capacity = %d\n", cap(hzslice) ) // capacity = 4
}
PS. 코드 해설
길이가 6인 배열에서 길이가 2인 슬라이스 생성.
슬라이스는 start_index가 2인 요소부터 시작함.
슬라이스는 배열의 끝까지 커질 수 있음. (즉, 용량이 4임)
슬라이스가 start_index 0부터 시작 시, 용량은 6이 됨.
Slice 생성 방법3 - make() 함수 이용
[구문]
slice_name := make([]type , length , capacity )
PS1. capacity 매개변수 미정의 시, length 값과 동일.
PS2. capacity 크게 할당 시, 요소 추가 시 속도 ↑ (단점: 메모리 차지 大)
PS3. capacity 작게 할당 시, 요소 추가 시 속도 ↓ (장점: 메모리 차지 小)
[예제]
package main
import ("fmt")
func main() {
a := make([]int, 3, 6)
fmt.Printf("a = %v\n", a ) // a = [0 0 0]
fmt.Printf("길이 = %d\n", len(a) ) // 길이 = 3
fmt.Printf("용량 = %d\n", cap(a) ) // 용량 = 6
b := make([]int, 3)
fmt.Printf("a = %v\n", b ) // a = [0 0 0]
fmt.Printf("길이 = %d\n", len(b) ) // 길이 = 3
fmt.Printf("용량 = %d\n", cap(b) ) // 용량 = 3
}
Slice 요소 접근
색인번호 이용해서 슬라이스의 특정 요소에 접근 가능.
색인번호는 0부터 시작. (첫 번째 요소:0, 두 번째 요소:1)
[예제]
package main
import ("fmt")
func main() {
hz := []int{1,3,5,7,9}
fmt.Println(hz[0] ) // 1
fmt.Println(hz[2] ) // 5
}
Slice 요소 변경
색인번호 이용해 슬라이스의 특정 요소의 값을 변경 가능.
[예제]
package main
import ("fmt")
func main() {
hz := []int{1,3,5,7,9}
hz[2] = 4
fmt.Println(hz[0]) // 1
fmt.Println(hz[2]) // 4
}
Slice 요소 추가 - append()함수
append() 함수 사용해 슬라이스 끝에 요소 추가 가능.
[구문]
slice_name = append(slice_name , element1 , element2 , ...)
[예제]
package main
import ("fmt")
func main() {
a := []int{1,2,3,4,5,6}
fmt.Printf("a = %v\n", a) // a = [1 2 3 4 5 6]
fmt.Printf("길이 = %d\n", len(a)) // 길이 = 6
fmt.Printf("용량 = %d\n", cap(a)) // 용량 = 6
a = append(a, 7, 8)
fmt.Printf("a = %v\n", a ) // a = [1 2 3 4 5 6 7 8]
fmt.Printf("길이 = %d\n", len(a) ) // 길이 = 8
fmt.Printf("용량 = %d\n", cap(a) ) // 용량 = 12
}
Slice 결합 연결 - append()함수
append() 함수 사용해 서도 다른 두 슬라이스를 결합 가능.
[구문]
slice3 = append(slice1 , slice2 ...)
PS. slice2 뒤의 점 3개 (...)는 슬라이스 결합 시 꼭 필요 .
[예제]
package main
import ("fmt")
func main() {
a := []int{1,2,3}
b := []int{4,5,6}
c := append(a, b...)
fmt.Printf("c = %v\n", c ) // c = [1 2 3 4 5 6]
fmt.Printf("길이 = %d\n", len(c) ) // 길이 = 6
fmt.Printf("용량 = %d\n", cap(c) ) // 용량 = 6
}
Slice 길이 변경
배열 과 달리, 슬라이스는 길이 변경 가능.
[예제]
package main
import ("fmt")
func main() {
arr := [6]int{0,1,2,3,4,5} // 배열
as := arr[1:5] // 슬라이스 생성
fmt.Printf("as = %v\n", as) // as = [1 2 3 4]
fmt.Printf("길이 = %d\n", len(as)) // 길이 = 4
fmt.Printf("용량 = %d\n", cap(as)) // 용량 = 5
as = arr[1:3] // 슬라이스 재생성해 슬라이스 길이 변경
fmt.Printf("as = %v\n", as ) // as = [1 2]
fmt.Printf("길이 = %d\n", len(as) ) // 길이 = 2
fmt.Printf("용량 = %d\n", cap(as) ) // 용량 = 5
as = append(as, 6, 7, 8, 9) // 슬라이스에 요소 추가해 길이 변경
fmt.Printf("as = %v\n", as ) // as = [1 2 6 7 8 9]
fmt.Printf("길이 = %d\n", len(as) ) // 길이 = 6
fmt.Printf("용량 = %d\n", cap(as) ) // 용량 = 10
}
Slice 메모리 효율성 - copy() 함수
슬라이스 사용 시, Go는 모든 기본 요소를 메모리에 로드함.
배열이 큰데 몇 개 요소만 필요 시, copy() 함수로 해당 요소를 복사.
copy()함수는 슬라이스에 필요한 요소만 있는 새 기본 배열 생성함 .
이렇게 하면 프로그램에 사용되는 메모리(즉, 용량)가 줄어듦.
[구문] - src 슬라이스를 dest 슬라이스에 복사해 새 기본 배열 생성.
copy(dest , src )
※ dest : 목적지 (destination) 슬라이스
※ src : 소스 (source) 슬라이스
※ 반환값: 복사된 요소 개수
[예제]
package main
import ("fmt")
func main() {
a := []int{1,2,3,4,5,6,7,8,9,10}
fmt.Printf("a = %v\n", a) // a = [1 2 3 4 5 6 7 8 9 10]
fmt.Printf("길이 = %d\n", len(a)) // 길이 = 10
fmt.Printf("용량 = %d\n", cap(a)) // 용량 = 10
// 필요한 숫자로 구성된 복사본 배열 생성
b := a[:len(a)-5]
aCopy := make([]int, len(b))
copy(aCopy, b)
fmt.Println(copy(aCopy, b)) // 5
// aCopy 경우
fmt.Printf("aCopy = %v\n", aCopy) // aCopy = [1 2 3 4 5]
fmt.Printf("길이 = %d\n", len(aCopy)) // 길이 = 5
fmt.Printf("용량 = %d\n", cap(aCopy) ) // 용량 = 5
// cf. b 경우
fmt.Printf("b = %v\n", b) // b = [1 2 3 4 5]
fmt.Printf("길이 = %d\n", len(b)) // 길이 = 5
fmt.Printf("용량 = %d\n", cap(b) ) // 용량 = 10
}
PS1. copy(aCopy, b) 통해서 용량이 작아진 새 기저 배열이 생성됨.
PS2. 기저 배열 (underlying array) : 숨어서 새 기준이 되는 배열.
주소 복사
랜덤 이동
최신댓글