Meandering Trajectory

new와 make 본문

컴퓨터/GoLang

new와 make

latentis 2017. 11. 12. 19:10

Go에는 메모리에 오브젝트를 생성하는데 쓰이는 내장 함수가 2가지 있다. make와 new가 그것이다.

new

new에 임의의 데이터 타입을 파라미터로 주고 호출하면 메모리에 해당 오브젝트를 생성한 뒤 오브젝트에 할당된 공간을 모두 0으로 초기화하고 그 포인터를 반환한다. 예를 들어

type Point struct {
    x int32
    y int32
}

ptr := new(Point)    // ptr의 타입은 *Point

이 코드에서 ptr.x와 ptr.y의 값은 0이 된다.

부연하면 new는 내장함수로 builtin 패키지에 속하고 Go 언어 공식 매뉴얼에 나온 프로토타입을 보면 다음과 같다.

func new(Type) *Type

Type을 파라미터로 받아 *Type을 반환하게 되어 있다. 반환하는 값의 자료형이 포인터이다.

C++이나 Java의 new 처럼 생성자를 이용한 초기화가 불가능한 반면 C의 calloc과 달리 데이터 타입을 제대로 지원하므로 기능상 C++의 new와 C의 calloc을 섞어놓은 함수라고 볼 수 있다.

make

make는 슬라이스(slice), 맵(map), 채널(chan)에 대해서만 사용 가능한 할당자다. Go 공식 매뉴얼을 보면

func make(t Type, size ...IntegerType) Type

어렇게 make는 new와 달리 오브젝트에 대한 포인터가 오브젝트 자체를 반환한다.

각 타입에 대한 사용 예는 다음과 같다.

a := make([]int, 10, 100) // 길이 10, 용량(capacity) 100인 슬라이스
c := make(chan int, 10)   // 길이 10인 버퍼드(buffered) 채널
c2 := make(chan int)      // 언버퍼드(unbuffered) 채널
m := make(map[string]int) // 맵

만약 아래와 같이 허용된 3가지 타입이 아닌 타입을 할당하려고 시도하면

x := make(Point)

이렇게 에러를 내면서 컴파일이 실패한다.

./main.go:14: cannot make type Point

할당자가 왜 2가지인가?

정리를 해보면

  • new: 오브젝트를 할당하고 내용을 0으로 채운 뒤 포인터를 반환.

  • make: 슬라이스, 맵, 채널에 대해서만 사용 가능하고 오브젝트 자체를 반환.

두 함수의 용도가 조금 다르다. 그런데 이게 2가지 할당자가 있어야 할 이유가 될까? 그게 이유가 되지는 않을 것 같은데 말이지...


Comments