• 회원가입
  • 로그인
  • 구글아이디로 로그인

GO - Slices (고랭 슬라이스)

1,037  
목차
  1. Slice 정의
  2. Slice 생성 방법1 - []datatype{values} 구문 이용
  3. Slice 생성 방법2 - Array 이용
  4. Slice 생성 방법3 - make() 함수 이용
  5. Slice 요소 접근
  6. Slice 요소 변경
  7. Slice 요소 추가 - append()함수
  8. Slice 결합 연결 - append()함수
  9. Slice 길이 변경
  10. 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) : 숨어서 새 기준이 되는 배열.



제목
GO - Home (고랭 입문)
GO - Intro (고랭 소개)
GO - Start (고랭 시작)
GO - Syntax (고랭 구문)
GO - Comments (고랭 주석)
GO - Variables (고랭 변수)
GO - Constants (고랭 상수)
GO - Output (고랭 출력)
GO - Data Types (고랭 데이터타입) - 자료형
GO - Arrays (고랭 배열)
GO - Slices (고랭 슬라이스)
GO - Operators (고랭 연산자)
GO - Conditions (고랭 IF조건문)
GO - switch (고랭 스위치조건문)
GO - For Loops (고랭 FOR반복문)
GO - Functions (고랭 함수)
GO - Maps (고랭 맵)
목록
찾아주셔서 감사합니다. Since 2012