🔥 make로 슬라이스 생성하기

445자
6분

Go 언어에서는 내장 함수 make를 사용하여 슬라이스를 생성할 수 있어요. 이 방법을 통해 동적 크기의 배열을 만들 수 있답니다.

make 함수는 지정된 타입, 길이, 그리고 선택적으로 용량을 인자로 받아 해당 타입의 초기화된 슬라이스를 반환해요. 함수 시그니처는 다음과 같아요:

func make([]T, len, cap) []T
 
go
  • T는 슬라이스의 원소 타입을 나타내요.
  • len은 슬라이스의 길이를 지정해요.
  • cap은 선택적으로 슬라이스의 용량을 지정할 수 있어요. 생략하면 길이와 같은 값으로 설정돼요.

make 함수는 주어진 길이와 용량을 가진 배열을 생성하고, 배열의 모든 원소를 해당 타입의 제로값으로 초기화해요. 그리고 그 배열을 가리키는 슬라이스를 반환하죠.

예를 들어, 다음 코드는 make를 사용하여 길이가 5이고 정수형 원소를 갖는 슬라이스 a를 생성해요:

a := make([]int, 5)  // len(a)는 5, cap(a)도 5
 
go

위 코드에서 make 함수는 정수형 슬라이스 a를 생성하고, 그 길이를 5로 설정하죠.

슬라이스의 용량(capacity)을 지정하고 싶다면, make 함수에 세 번째 인자를 전달하면 돼요:

b := make([]int, 0, 5) // len(b)는 0, cap(b)는 5
 
b = b[:cap(b)] // len(b)는 5, cap(b)는 5가 됨
b = b[1:]      // len(b)는 4, cap(b)는 4가 됨
 
go

위 코드에서는 길이가 0이고 용량이 5인 정수형 슬라이스 b를 생성했어요. 그리고 슬라이싱 연산을 통해 b의 길이와 용량을 조절하는 모습을 볼 수 있죠.

이제 좀 더 복잡한 예제를 살펴볼까요?

package main
 
import "fmt"
 
func main() {
	// 길이와 용량이 5인 정수형 슬라이스 a 생성
	a := make([]int, 5)
	printSlice("a", a)
 
	// 길이는 0, 용량은 5인 정수형 슬라이스 b 생성
	b := make([]int, 0, 5)
	printSlice("b", b)
 
	// b의 첫 번째 요소부터 2개 요소를 가져와 c 생성
	c := b[:2]
	printSlice("c", c)
 
	// c의 세 번째 요소부터 마지막 요소까지 가져와 d 생성
	d := c[2:5]
	printSlice("d", d)
}
 
// 슬라이스의 길이, 용량, 내용을 출력하는 함수
func printSlice(s string, x []int) {
	fmt.Printf("%s len=%d cap=%d %v\n",
		s, len(x), cap(x), x)
}
 
go

위 예제는 make를 사용하여 다양한 슬라이스를 생성하고, 슬라이싱 연산을 통해 새로운 슬라이스를 만드는 과정을 보여줍니다.

main 함수에서는 다음과 같은 작업을 수행해요:

  1. make([]int, 5)로 길이와 용량이 5인 정수형 슬라이스 a를 생성합니다.
  2. make([]int, 0, 5)로 길이는 0, 용량은 5인 정수형 슬라이스 b를 생성합니다.
  3. b[:2]b의 첫 번째 요소부터 2개 요소를 가져와 새로운 슬라이스 c를 생성합니다.
  4. c[2:5]c의 세 번째 요소부터 마지막 요소까지 가져와 새로운 슬라이스 d를 생성합니다.

그리고 printSlice 함수를 사용하여 각 슬라이스의 이름, 길이, 용량, 내용을 출력하죠.

이 예제를 실행하면 다음과 같은 결과를 얻을 수 있어요:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]
text

출력 결과를 통해 make와 슬라이싱 연산이 슬라이스의 길이와 용량에 어떤 영향을 미치는지 확인할 수 있답니다.

이렇게 make 함수를 활용하면 다양한 크기와 용량을 가진 슬라이스를 유연하게 생성할 수 있어요. 상황에 맞게 적절한 슬라이스를 만들어 사용하면 메모리 효율성과 프로그램의 성능을 높일 수 있겠죠?