728x90

대부분 프로그래밍 언어는 메모리를 할당할 때 스택 메모리 영역 또는 힙 메모리 영역을 사용합니다.

이론상 스택 메모리 영역이 힙 메모리 영역 보다 훨씬 효율적이기 대문에 스택 메모리 영역에서 메모리를 할당하는 게 더 좋지만, 스택 메모리는 함수 내부에서만 사용 가능한 영역 입니다.

그래서 함수 외부로 공개되는 외부 메모리 공간은 힙 메모리 영역에서 할당합니다. C/C++ 언어에서는 malloc() 함수를 직접 호출해서 힙 메모리 공간을 할당합니다. 자바에서는 클래스 타입을 힙에 기본 타입을 스택에 할당합니다. Golang 은 탈출 검사 (excape analysis)를 해서 어느 메모리에 할당할지를 결정합니다.

 

함수 외부로 공개되는 인스턴스의 경우 함수가 종료되어도 사리지지 않습니다.

 

package main

import "fmt"

type user struct {
	Name string
	Age  int
}

func NewUser(name string, age int) *user {
	var u = user{name, age}
	return &u // 탈출 분석으로 u 메모리가 사라지지 않음
}

func main() {
	userPointer := NewUser("jongyunha", 23)
	fmt.Println(userPointer)

}

 

NewUser() 함수에서 선언한 u 변수를 반환했습니다. 함수 내부에서 선언된 변수는 함수가 종료되면 사라집니다.

이 코드는 이미 사라진 메모리를 가르키는 댕글링 오류가 발생해야 합니다. 하지만 프로그램이 멀쩡하게 잘 동작합니다.

 

Golang 에서는 탈출 검사를 통해서 u 변수의 인스턴스가 함수 외부로 공개되는 것을 분석해내서 u 를 스택 메모리가 아닌 힙 메모리에서 할당하게 됩니다. 즉 go 언어는 어떤 타입이나 메모리 할당 함수에 의해서 스택 메모리를 사용할지 힙 메모리를 사용하지를 결정하는게 아닌 메모리 공간이 함수 외부로 공개되는지 여부를 자동으로 검사해서 스택 메모리에 할당할지 힙 메모리에 할당할지 결정합니다.

 

또한 Golang 에서는 스택 메모리는 계속 증가되는 다이나믹 메모리 풀 입니다. 일정 크기를 갖는 C/C++ 언어와 비교해 메모리 효율성이 높고 재귀 호출 때문에 스택 메모리가 고갈되는 문제도 발생하지 않습니다.

 

1줄 결론 Golang 짱짱

728x90