개발바닥

[기본 개념 요약] 슬라이스 본문

GO 언어

[기본 개념 요약] 슬라이스

라이언 2023. 4. 11. 23:01
반응형

슬라이스란?

Golang 에서 사용하는 동적 배열이다. 동적 배열과 정적 배열의 차이점은 동적 배열은 런타임 실행 중 사이즈가 변경이 가능하고,

정적 배열은 컴파일시 코드를 기계어로 변경하면서 사이즈가 고정이 된다.

슬라이스는 Go에서 제공하는 배열을 가리키는 포인터 타입이다.

슬라이스는 append() 내장 함수를 사용하여 동적으로 요소들을 추가할 수 있다.

 

슬라이스 구조

type SliceHeader struct{
	Data uintptr // 실제 배열을 가리키는 포인터
    	Len int 	 // 요소 개수 (배열에서 사용하고 있는 개수)
    	Cap int 	 // 실제 배열의 길이
}

내장 함수 append() 사용 방법 및 동작 원리

슬라이스에 요소를 추가한 새로운 슬라이스를 반환

기존 슬라이스가 바뀔 수도 있고 새로 할당할 수도 있다.

어떤 기준으로 메모리 주소를 새로 만드는지?

슬라이스 cap 공간이 있는지 체크 후 부족하면 새로운 메모리 주소를 할당한다.

남은 빈 공간 = cap - len

	arr := make([]int,3,3)
	fmt.Printf("slice(%p): len=%d cap=%d %v\n", arr, len(arr), cap(arr), arr)
	// 메모리 슬라이스 새로 할당
	arr = append(arr,1)
	fmt.Printf("slice(%p): len=%d cap=%d %v\n", arr, len(arr), cap(arr), arr)
	/*
		slice(0xc00010a000): len=3 cap=3 [0 0 0]
		slice(0xc000114030): len=4 cap=6 [0 0 0 1]
	*/
	
	
	arr1 := make([]int,3,4)
	fmt.Printf("slice(%p): len=%d cap=%d %v\n", arr1, len(arr1), cap(arr1), arr1)
	// 메모리 슬라이스 기존 주소 할당
	arr1 = append(arr1,1)
	fmt.Printf("slice(%p): len=%d cap=%d %v\n", arr1, len(arr1), cap(arr1), arr1)	
	
	/*
		slice(0xc000116000): len=3 cap=4 [0 0 0]
		slice(0xc000116000): len=4 cap=4 [0 0 0 1]	
	*/

 

그러므로 append() 사용시 새로운 메모리 주소를 할당 했는지 주의할 필요가 있다.

 

슬라이싱이란?

슬라이싱은 배열의 일부를 집어내는 기능이다. 즉, 새로운 메모리 주소를 할당하는 것이 아니라 기존 메모리 주소을 가리킨다. 

슬라이싱의 결과가 슬라이스이다. 

 

슬라이싱 사용법

	arr1 := []int{1,2,3,4,5}
	arr2 := arr1[1:3]
	fmt.Println(len(arr1),cap(arr1))	// 5, 5
	fmt.Println(len(arr2),cap(arr2))	// 2, 4 (cap이 4인 이유는 시작 인덱스 부터 남은 cap 공간까지 계산하기 때문에)

 

 

반응형

'GO 언어' 카테고리의 다른 글

[기본 개념 요약] 구조체  (0) 2023.03.17
[기본 개념 요약] 배열  (0) 2023.03.14
[기본 개념 요약] 변수  (0) 2023.03.12
Echo framework로 간단한 웹서버 만들기  (1) 2022.03.27
유닛 테스트(Unit Test)  (0) 2022.03.09
Comments