일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 터미널
- mf642cdw
- mopria
- nil
- Reflection
- mistel md600 alpha
- 벤치마크
- 바로코
- 양자역학
- Griffiths
- Golang
- 엘리스배열
- 스플릿키보드
- 고양이책
- eslip
- 키보드
- Go 언어
- 패널라인
- emacs
- 체리적축저소음
- doom-emacs
- 리플렉션
- md600alpha
- 음각몰드
- go언어
- 건프라
- driverless
- 다이어트
- Go
- 이맥스
- Today
- Total
Meandering Trajectory
new와 make 본문
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가지 할당자가 있어야 할 이유가 될까? 그게 이유가 되지는 않을 것 같은데 말이지...
'컴퓨터 > GoLang' 카테고리의 다른 글
Go가 내 에러를 먹었어염! ㅠ.ㅠ (0) | 2017.12.02 |
---|---|
Go 코드에서의 에러 처리 (0) | 2017.11.18 |
select 문: 여러 채널에서 데이터 읽어 처리하기 (0) | 2017.11.10 |
Go 언어: 빈 슬라이스와 nil (0) | 2017.10.20 |
클로저(Closure)와 데코레이터(Decorator) 패턴 (0) | 2017.08.14 |