메모리 할당

메모리 할당 (Allocation)

Go에서 변수를 만들고 싶은데, 그 변수의 주소를 값으로 받아야 하는 상황이라면 어떻게 할까요? 가장 대표적인 방법이 내장 함수 new를 쓰는 거예요. new새로 초기화된 변수를 만들고, 그 변수를 가리키는 포인터를 돌려주는 함수예요.

출처: Go Specification

본문

내장 함수 new는 새로 초기화된 변수를 만들고 그 변수를 가리키는 포인터를 반환해요. 인자는 하나만 받는데, 그 인자는 타입(type) 이거나 표현식(expression) 일 수 있어요.

인자가 타입 T라면, new(T)는 타입 T의 변수를 할당하고 그 변수를 zero value로 초기화해요.

인자가 표현식 x라면, new(x)x의 타입을 가진 변수를 할당하고 그 변수를 x의 값으로 초기화해요. 여기서 조심할 게 몇 가지 있어요. 만약 그 값이 untyped 상수라면, 먼저 암시적 변환(conversion)으로 기본 타입으로 바뀌고요, untyped boolean 값이라면 먼저 암시적으로 bool 타입으로 변환돼요. 그리고 미리 선언된 식별자 nilnew의 인자로 쓸 수 없어요.

예를 들어볼게요. new(int)new(123)은 각각 타입 int의 새 변수를 가리키는 포인터를 반환해요. 첫 번째 변수의 값은 0, 두 번째 변수의 값은 123이죠. 비슷하게,

type S struct { a int; b float64 }
new(S)

이건 타입 S의 변수를 할당하고, 그 변수를 초기화한 뒤(a=0, b=0.0), 그 변수의 주소를 담은 *S 타입의 값을 반환해요.

더 알아보기