Go Lang 기초 9 - 슬라이스(Slice)

만두아빠·2021년 7월 26일
1

Go Lang 기초

목록 보기
9/14
post-thumbnail

Go Lang의 슬라이스(Slice)는 값을 추가하여 확장가능한 자료구조로 크기가 고정되어 있지 않고 동적으로 배열의 크기를 증가시킬 수 있습니다.
슬라이스는 Go Lang 내장 함수인 make를 통해 공간을 확보할 수 있다.
make 함수는 (타입type, 길이length, 용량capacity)를 선언하여 사용합니다. 여기서 용량은 내부배열의 최대길이를 의미합니다.

  • 슬라이스 선언은 배열(Array)과 거의 비슷합니다. 다만, []안에 길이 지정을 하지 않습니다.
var 변수명 [] 데이터타입
package main

import "fmt"

func main() {
	s :=  []int{0, 1, 2, 3, 4, 5}
	l := len(s)
	fmt.Println(l, cap(s), s)
}

출력결과물
6 6 [0 1 2 3 4 5]

cap()은 배열의 기본 용량을 알려주고, len()은 배열에 몇 개의 항목이 있는지를 알려주는 함수입니다.
len(s)와 cap(s) 를 통해 슬라이스의 길이와 용량를 확인 할 수 있습니다.


make 함수를 사용해 슬라이스를 조금 더 자세히 다뤄보도록 합시다.

s := make([]int, 3, 3)

s는 정수형 타입에 길이가 3이고 용량 3인 슬라이스입니다.
슬라이스로 부터

s[0] = 1
s[1] = 2
s[2] = 3
fmt.Println(s[1])

각 원소자리에 값을 하나씩 지정해주고 출력을 해봅니다.

출력결과물
2


슬라이싱(Slicing)은 슬라이스의 특정 영역을 추출하는 기능입니다.

package main

import "fmt"

func main() {
	s := make([]int, 3, 3)
	s[0] = 1
	s[1] = 2
	s[2] = 3
	t := s[0:3]
	u := s[:3]
	v := s[1:]
	fmt.Printf("t = %d, u = %d, v = %d", t, u, v)
}

출력결과물
t = [1 2 3], u = [1 2 3], v = [2 3]

슬라이싱의 경우 u는 0번 index부터 3번 index 바로 전까지, v는 2번째 index부터 마지막 index까지 슬라이싱 가능합니다.


package main

import "fmt"

func main() {
	s := make([]int, 0, 3)
	for i := 0; i < 5; i++ {
		s = append(s, i)
		fmt.Printf("cap : %v, len : %v, add : %p\n", cap(s), len(s), s)
	}
}

출력결과물
cap : 3, len : 1, add : 0xc000016160
cap : 3, len : 2, add : 0xc000016160
cap : 3, len : 3, add : 0xc000016160
cap : 6, len : 4, add : 0xc000018120
cap : 6, len : 5, add : 0xc000018120

Go Lang의 슬라이스는 기본 배열의 크기를 자동으로 조절합니다.
append를 통해 추가한 값이 처음 설정된 용량을 넘어서면 더 큰 용량의 새 슬라이스를 반환합니다. 이 때 포인터 주소도 새로운 주소로 변경됩니다.


profile
Velog는 잠시 쉬어갑니다! 아래의 링크로!

0개의 댓글