메모리 구조

Swift에서 애플리케이션의 메모리 구조는 코드, 데이터, 힙, 스택의 네 가지 주요 영역으로 구성됩니다. 이러한 각 영역은 다양한 유형의 데이터와 메모리 할당 및 할당 해제의 수명주기를 관리하는 고유한 목적을 제공합니다.
코드 영역(Code Area) → Read-Only
- 애플리케이션의 실행 코드가 저장되는 영역
- 일반적으로 읽기 전용이며, 프로그램 실행 중 변경되지 않습니다.
- 예시: 함수 정의, 클래스 정의 등의 코드가 이 영역에 저장됩니다.
// Code 영역: 함수 정의
func greet() {
print("Hello, World!")
}
// 함수 호출
greet()
데이터 영역(Data Area) → Read-Write
- 전역 변수와 정적(
static) 변수가 저장되는 영역 - 프로그램 실행 중 데이터 영역의 값이 변경될 수 있습니다.
- 프로그램 시작과 동시에 할당되며, 프로그램 종료 시 메모리가 해제됩니다.
- 예시: 전역 변수
var globalCount = 0, 정적 변수static let PI = 3.14159가 데이터 영역에 저장됩니다.
// Data 영역: 전역 변수
var globalCounter = 0
class Counter {
// Data 영역: 정적 변수
static var totalCount = 0
init() {
Counter.totalCount += 1
}
}
// 전역 변수와 정적 변수 사용
globalCounter += 1
let counter1 = Counter()
let counter2 = Counter()
print(globalCounter) // 출력: 1
print(Counter.totalCount) // 출력: 2
힙 영역(Heap Area) ⭐️
- 동적으로 할당되는 메모리 영역
- 메모리 관리가 복잡하며, 사용 후 반드시 메모리를 해제해 줘야 합니다. → 메모리 누수 위험
- 런타임 시 결정되기 때문에 데이터의 크기가 확실하지 않을 경우 사용합니다.
- 클래스 인스턴스, 배열, 딕셔너리 등의 참조 타입 데이터가 이 영역에 저장됩니다.
- 메모리 할당을 위해 malloc, calloc 등의 함수를 사용할 수 있습니다.
class Person {
var name: String
init(name: String) {
self.name = name
}
}
// Heap 영역: 동적으로 Person 인스턴스 할당
let personInstance = Person(name: "John Doe")
// personInstance 참조는 Stack 영역에 저장되고, 실제 객체는 Heap 영역에 저장됩니다.
print(personInstance.name) // 출력: John Doe
스택 영역(Stack Area)
- 함수 호출 시 생성되는 지역 변수와 매개변수, 리턴 값 등이 저장되는 영역
- 함수 호출 / 반환 시 자동으로 메모리가 할당/해제됩니다.
- 컴파일 타임에 의해 결정되기 때문에 무한정 할당할 수 없습니다. → 스택 오버플로 주의
- 스택 영역의 메모리 관리가 상대적으로 간단합니다.
func add(a: Int, b: Int) -> Int {
// Stack 영역: 지역 변수
let result = a + b
return result
}
// 함수 호출
let sum = add(a: 10, b: 20)
print(sum) // 출력: 30
통합 예시
각각의 메모리 영역을 모두 사용하는 통합 예시입니다.
// Data 영역: 전역 변수
var globalValue = 100
class SomeClass {
// Data 영역: 정적 변수
static var staticValue = 200
}
func exampleFunction() {
// Code 영역: 함수 정의
print("Executing exampleFunction")
// Stack 영역: 지역 변수
let localValue = 10
// Data 영역: 정적 변수 접근
SomeClass.staticValue += 1
// Heap 영역: 동적으로 할당된 객체
let dynamicObject = SomeClass()
dynamicObject.someProperty = "Hello"
// 변수들 접근
print("Global Value: \(globalValue)") // Data
print("Local Value: \(localValue)") // Stack
print("Static Value: \(SomeClass.staticValue)") // Data
print("Dynamic Object Property: \(dynamicObject.someProperty)") // Heap
// 함수가 끝나면 localValue와 dynamicObject 참조 해제
}
class SomeClass {
var someProperty: String?
}
// 함수 호출
exampleFunction()
이 통합 예시에서는,
- 함수
exampleFunction정의는 Code 영역에 저장됩니다. globalValue와SomeClass.staticValue는 Data 영역에 저장됩니다.dynamicObject인스턴스는 Heap 영역에 저장됩니다.exampleFunction내부의localValue와dynamicObject참조는 Stack 영역에 저장됩니다.
'걔 (개발)로그 > Swift' 카테고리의 다른 글
| Swift의 순환 참조(Circular Reference)는 어떻게 해결하지? (0) | 2024.07.02 |
|---|---|
| Swift의 ARC? 강한 참조? 약한 참조? | 참조가 강하고 약하기도 한다고...? (0) | 2024.05.19 |
| Swift에서 Filter와 Map (0) | 2024.05.17 |
| Swift에서 프로퍼티 (Properties)와 메서드 (Methods) (0) | 2024.05.17 |
| Swift에서 상속 (Inheritance) (0) | 2024.05.17 |