본문 바로가기
프로그래밍/기타

[Go] Java 개발자의 GoLang 튜토리얼 - New vs Make

by 사바라다 2023. 9. 10.

개요

안녕하세요. Java는 new를 이용하여 Heap 메모리에 데이터를 할당할 수 있습니다. 반면 Go는 메모리에 할당할 수 있는 방법이 여럿있고 해당 방법에 따라서 할당되는 방식이 달라집니다. 오늘은 이러한 Golang의 Memory 할당에 대해서 알아보도록 하겠습니다.

Java에서의 객체 메모리 할당

Java에서는 아래처럼 new keyword를 이용하여 heap 메모리에 객체(Object)를 할당할 수 있습니다.

User user = new User();

Go 언어에서도 메모리에 객체를 할당할 수 있는 방법을 제공합니다. Go 언어는 Java와는 다르게 메모리를 할당하고 값을 초기화 할 수 있는 방법을 여럿 제공하고 있습니다. 어떠한 것들이 있는지 확인해보고 그 차이점을 확인해보도록 하겠습니다.

new

new 키워드는 객체에 memory를 할당하는 함수입니다. 아규먼트에는 값이 아닌 타입을 주입합니다. 타입이란 int와 같은 primitive 타입이 있습니다. 자세한 내용은 Java 개발자의 GoLang 튜토리얼 - 데이터 타입과 타입 변환 (Conversion)를 참고해주세요. 그리고 커스텀하게 만든 struct object type이 들어갈 수 있습니다. 그리고 반환되는 값으로는 zero value들로 초기화 되고 새롭게 메모리에 할당된 객체애 대한 pointer입니다.

func new(Type) *Type

new 코드는 아래와 같이 사용할 수 있습니다. 기본적으로는 new 함수를 사용하지만 다른 방법으로도 메모리 할당을 할 수 있습니다.

var newHello *Hello = new(Hello)
fmt.Println("new : ", newHello) // new :  &{ }

// 아래 코드는 new 메서드를 사용하는것과 동일한 효과를 얻을 수 있는 다른 방법들입니다.

var newHello2 *Hello = &Hello{}
fmt.Println("new2 : ", newHello2) // new2 :  &{ }

var newHelloValue Hello
newHello3 := &newHelloValue
fmt.Println("new3 : ", newHello3) // new3 :  &{ }

선언과 초기화를 동시에하는 방법은 아래와 같습니다.

var newHello2 *Hello = &Hello{
    maria: "maria",
    karol: "karol",
}

make

make는 slice, map, 그리고 channel의 메모리를 할당하고 초기화하는 함수입니다. new 처럼 첫번째 아규먼트는 type이입니다. new와의 차이점은 pointer를 반환하는 것이 아니라 type 자체를 반환합니다.

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

make의 사용방법은 아래와 같습니다. 아래처럼 선언하면 내부의 값들은 타입에 맞는 초기값으로 세팅됩니다. 예제에서는 map을 사용해보도록 하겠습니다. 이 외의 slice로 초기화할때는 []int 타입으로 선언해주시면 됩니다. make는 호출할 때 capacity(용량)과 length(길이)를 지정할 수 있습니다. 그리고 이러한 make도 다른 방법으로 초기화할 수 있습니다.

make := make(map[string]bool, 0)
fmt.Println("make : ", make) // map[]

// Using a composite literal to initialize a map.
make2 := map[string]bool{}
fmt.Println("make2 : ", make2) // map[]

선언과 동시에 내부의 element를 초기화하는 방법은 아래와 같습니다.

make3 := map[string]bool{
    "java": false,
    "go":   true,
}
fmt.Println("make3 : ", make3) // make3 :  map[go:true java:false]

마무리

오늘은 go 언어에서 new와 make의 차이점에 대해서 알아보는 시간을 가져보았습니다.

new는 개별 object를 선언할때 사용하며, make는 slice, map, channel을 할당할 때 사용한다는 사실을 알게되었습니다.

다음포스팅에서 뵙겠습니다.

감사합니다.

참조

[1] https://medium.com/learn-code/golang-new-vs-make-8a4dbd84e92b

[2] https://stackoverflow.com/questions/9320862/why-would-i-make-or-new

[3] https://pkg.go.dev/builtin@go1.21.1

댓글