메모리 할당
메모리 할당 (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 타입으로 변환돼요. 그리고 미리 선언된 식별자 nil은 new의 인자로 쓸 수 없어요.
예를 들어볼게요. new(int)와 new(123)은 각각 타입 int의 새 변수를 가리키는 포인터를 반환해요. 첫 번째 변수의 값은 0, 두 번째 변수의 값은 123이죠. 비슷하게,
type S struct { a int; b float64 }
new(S)
이건 타입 S의 변수를 할당하고, 그 변수를 초기화한 뒤(a=0, b=0.0), 그 변수의 주소를 담은 *S 타입의 값을 반환해요.
더 알아보기
- 변수 (Variables)
- 포인터 타입 (Pointer types)
- Zero value
- 복합 리터럴 (Composite literals) —
new로 만든 슬라이스·맵 값과 어떤 점이 다른지도 함께 보면 좋아요