이 글은 Effective Go를 일부 번역한 글입니다.


자료

make로 할당하기

다시 할당 이야기를 해 보자. 내장 함수 make(T, args)는 new(T)와 쓰임이 다르다. 조각, 맵, 채널만 만들고, (*T 형이 아니라) T 형 값을 (0 값이 아니라) 초기 설정해 반환한다. 예로 조각은 3개 항목 즉, (배열 내) 자료를 가리키는 포인터, 길이, 용량으로 이뤄진 기술자(Descriptor)다. 그리고 이 기술자를 초기 설정할 때까지 그 조각은 nil이다. 조각, 맵, 채널은 make로 내부 자료 구조를 초기 설정하고 사용할 값을 준비한다. 아래 예를 보라.

make([]int, 10, 100)

이 문장은 정수 100개짜리 배열을 하나 할당하고, 길이가 10, 용량이 100이고 배열 요소 중 처음 10개를 가리키는 조각 구조체를 만든다. (용량을 생략하고 조각을 만들 수도 있다. 더 알려면 조각 부분을 보라.) 반면 new([]int)는 새로 할당한 조각 구조체를 0 값으로 만들고 그 포인터를 반환한다. 이 포인터는 값이 nil인 조각을 가리키는 포인터다.

아래 예를 보면 new와 make의 차이를 알 수 있다.

var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful
var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints

// Unnecessarily complex:
var p *[]int = new([]int)
*p = make([]int, 100, 100)

// Idiomatic:
v := make([]int, 100)

make는 맵, 조각, 채널에만 적용하며 포인터를 반환하지 않는다는 걸 명심하라. 정확한 포인터를 얻으려면 new로 할당하거나 명시적으로 변수에서 주소를 얻으라.