| 메모리 영역 | 설명 |
|---|---|
| 코드 영역 (Text Segment) | 실행 가능한 바이너리 코드 저장 |
| 데이터 영역 (Data/BSS) | 전역 변수 및 static 변수 저장 |
| 힙 (Heap) | 동적으로 할당된 메모리 (예: class, Array, String) |
| 스택 (Stack) | 지역 변수, 함수 호출 스택 프레임 저장 |
| 메모리 매핑 영역 (Memory Mapped) | 프레임워크, dylib 등이 매핑됨 |
iOS는 ARC(Automatic Reference Counting)을 통해 메모리를 관리
| 항목 | 스택 (Stack) | 힙 (Heap) |
|---|---|---|
| 할당 방식 | 컴파일 타임 | 런타임 |
| 접근 속도 | 빠름 (선입후출) | 느림 (포인터 기반) |
| 할당 대상 | 지역 변수, 함수 호출 정보 | 객체 인스턴스 (클래스 등) |
| 관리 주체 | 시스템(OS) | 개발자/런타임 (ex. ARC) |
| 수명 | 함수 종료 시 자동 해제 | 명시적으로 해제 필요 (ARC 등) |
| 메모리 크기 | 상대적으로 작음 | 큼 |
함수 호출시 Stack Frame이 생성됨
ex)
func greet() {
let name = "subok" // stack에 저장
print(name)
}
Stack Overflow는 어떤 경우에 발생?
스택 메모리 초과 사용시 발생하며, 주로 다음과 같은 경우 발생
너무 깊은 재귀 호출
무한 재귀
너무 큰 지역 변수 선언
| 타입 | 예시 | 주로 할당 위치 | 이유 |
|---|---|---|---|
| 값 타입(Value Type) | struct, enum | 스택 또는 힙 | 작은 struct는 스택, 큰 struct는 힙 (최적화에 따라 다름) |
| 참조 타입(Reference Type) | class, closure | 힙 | 참조를 공유해야 하기 때문 |
값 타입
ex)
var a = [1, 2, 3]
var b = a // b는 a를 공유함 (복사 X)
b.append(4) // 이때 진짜 복사 발생 (COW)
참조 타입
| 질문 | 핵심 요약 |
|---|---|
| 메모리 구조 | 코드, 데이터, 힙, 스택, 메모리 매핑 영역 |
| 힙 vs 스택 | 힙: 참조 타입, 느림 / 스택: 값 타입(일반적), 빠름 |
| 함수 호출 시 스택 | 스택 프레임 생성 → 지역 변수 저장 |
| 재귀 시 스택 | 호출마다 프레임 누적 → Stack Overflow 위험 |
| 값/참조 타입 메모리 | 값: 주로 스택, 참조: 힙 |
| 복사 방식 | 값 타입은 COW, 참조는 포인터 공유 |
| Stack Overflow | 깊은 재귀, 큰 지역 변수 등으로 발생 |