`make` vs `new`

didnlie23·2023년 3월 8일
0

golang

목록 보기
1/3
post-thumbnail

Reference

make

Golang의 make(T, args) 함수는 []T, map[K]V, 그리고 chan T 타입만을 위한 built-in 함수이다. 이 3가지 타입에 할당되는 값은 사실 내부적으로 특정 자료 구조를 통해 실제 데이터가 담긴 메모리를 참조하기 때문에, 개발자의 의도와 부합하도록 코드가 동작하려면 참조하는 자료 구조의 초기화도 함께 이루어져야 한다.

보통 선언은 T 타입의 변수를 위한 메모리를 할당받는 것을 의미하고, 초기화는 변수에 값을 할당하는 작업을 의미한다.

[]T 타입을 예로 들어보려 한다.

a := make([]byte, 5)

위 코드의 결과를 메모리상에 표현하면 다음과 같을 것이다.

실제로 a에 담긴 값은 배열이 아니라 배열을 참조하는 구조체이다. 만일 a가 참조할 배열이 초기화되지 않는다면, a[]byte 타입으로써의 역할을 수행하지 못할 것이다.

[]T 타입과 마찬가지로 map[K]V, chan T 타입 또한 해당 타입의 값 이외에 추가적인 초기화가 필요하다. 따라서, 단순히 값에 해당하는 구조체만 초기화한 후 그 구조체의 포인터를 반환해주는 new 함수보다는, 내부적으로 필요한 초기화 작업을 거쳐 바로 사용될 수 있는 값을 반환해주는 make 함수를 사용하는 것이 대부분의 상황에서 바람직하다.

new

built-in 함수인 new(T) 함수는 단순히 T 타입을 위한 메모리를 할당받고, 해당 메모리를 참조하는 포인터를 반환한다. 물론 변수에 담길 값은 T 타입의 zero-value이다.

주의!
make 함수는 해당 타입의 값을 참조하는 포인터를 반환하지 않는다. 포인터가 필요한 경우 new 함수를 사용하거나 & 연산자를 사용해 변수의 주솟값을 가져와야 한다.

profile
with golang

0개의 댓글