먼저, 프로그램이 실행되기 위해서는 프로그램이 메모리에 로드(load)되어야 한다.
그리고 프로그램에서 사용되는 변수들을 담을 메모리 공간도 필요하다.
컴퓨터 운영체제는 프로그램 실행을 위해 4가지 메모리 공간을 제공한다.
1. 코드(code) 영역
2. 데이터(data) 영역
3. 힙(heap) 영역
4. 스택(stack) 영역

작성한 소스코드가 저장되는 공간이다.
CPU는 코드 영역에 저장된 명령어를 하나씩 처리한다.
전역변수, 정적(static)변수가 저장되는 공간이다.
프로그램의 실행과 동시에 메모리에 할당되고, 프로그램이 종료될 때 소멸된다.
// Swift
// 전역변수
let a: String = "프로그램 실행과 동시에 메모리에 할당 1"
let b: String = "프로그램 실행과 동시에 메모리에 할당 2"
struct Test {
// 정적변수
static let a: String = "프로그램 실행과 동시에 메모리에 할당 3"
}
사용자가 직접 관리할 수 있는 공간이며, 직접 관리 해야만하는 공간이다.
사용하고 난 후 메모리에서 직접 해제하지 않으면, 메모리 릭(Memory Leak)이 발생하여 크래쉬를 유발 할 수 있다.
사용자에 의해 메모리 공간이 동적으로 할당 및 해제 되므로,
메모리의 크기는 런타임에 결정된다.
Swift에서는 Class, Closure, Actor등이 힙 영역에 해당된다.
지역변수, 매개변수가 저장되는 공간이다.
함수의 실행과 동시에 메모리에 할당되고, 함수가 종료될 때 소멸된다.
후입선출(LIFO)방식으로, 가장 늦게 저장된 데이터가 인출된다.
지역변수, 매개변수의 메모리 크기는 컴파일할 때 알 수 있으므로,
메모리 크기는 컴파일 시점에 결정된다.
Swift에서는 Struct, Enum등이 스택 영역에 해당된다.
// Swift
struct Test {
let a: String = "지역변수 1"
let b: String = "지역변수 2"
func printAB(a: String, b: String) {
// 함수 실행과 동시에 a, b 매개변수 스택에 저장
print("\(a), \(b)")
// 함수가 종료될 때 a, b 매개변수 스택에서 해제
}
}