iOS/Common

Swift의 메모리 구조

TDCIAN 2024. 3. 29. 08:42

 

Swift의 메모리 구조

Swift에서 메모리는 주로 네 가지 영역으로 나눌 수 있습니다. 

 

(1) 코드(Code) 영역

: 실행 가능한 프로그램 코드를 기계어 형태로 저장합니다. 이 영역은 읽기 전용(Read-Only)이며, 프로그램의 실행 중에 변경되지 않습니다.

 

(2) 데이터(Data) 영역

: Swift 정적 변수, 상수, 타입 메타데이터 등을 저장합니다. 프로그램 시작과 동시에 할당되며 프로그램이 종료되면 메모리가 해제됩니다. 실행 도중 변경될 수 있습니다(Read-Write).

var name: String = "FrenteBW"
var age: Int = 25

struct Place {
	static let country: String = "Korea"
}

위 코드에서 name, age, Place 구조체의 country 정적 변수는 데이터 영역에 저장됩니다. 이들은 프로그램 실행 중에 값을 변경할 수 있습니다.

 

(3) 힙(Heap) 영역

: 동적 메모리 할당을 위해 사용됩니다. 힙 메모리는 프로그래머가 명시적으로 할당하고 해제해야 하며, 힙 메모리의 크기는 가상 메모리의 크기에 의해 결정됩니다. 힙 메모리는 느리게 접근되지만, 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있으므로 유연성이 높습니다. 클래스 인스턴스(Class Instance), 클로저와 같은 참조 타입의 값이 힙에 자동 할당 됩니다.

class Example {
	let bar: Bool = true
    let foo: Int = 0
}

let exampleInstance = Example()

Example 클래스의 인스턴스 exampleInstance는 힙 영역에 할당됩니다. 힙 메모리는 가상 메모리의 크기에 의해 결정되며, 힙 메모리의 크기는 실행 시점에 결정됩니다.

 

(4) 스택(Stack) 영역

: 함수 호출과 로컬 변수의 생명주기를 관리합니다. 스택은 LIFO(Last In, First Out) 방식으로 동작하며, 함수가 호출될 때마다 새로운 스택 프레임이 생성되고, 함수가 종료될 때 해당 스택 프레임이 해제됩니다.

func add(_ a: Int, _ b: Int) -> Int {
	let result = a + b
    return result
}

add 함수 내의 result 변수는 스택 영역에 할당됩니다. 함수가 종료되면, result 변수는 자동으로 스택에서 해제됩니다.

 

힙 영역에서의 객체 할당 및 관리

힙 영역에서 객체는 동적으로 할당되며, 프로그래머가 명시적으로 할당하고 해제해야 합니다. 힙 메모리는 가상 메모리의 크기에 의해 결정되며, 힙 메모리의 크기는 실행 시점에 결정됩니다. 힙 메모리는 느리게 접근되지만, 프로그래머가 필요에 따라 메모리를 할당하고 해제할 수 있으므로 유연성이 높습니다.

class Drink {
	var type: String
    
    init(type: String) {
    	self.type = type
    }
}

let favoirteDrink = Drink(type: "Chocolate")
let secondFavorite = favoriteDrink
secondFavorite.type = "Matcha"
print(secondFavorite.type) // "Matcha"
print(favoriteDrink.type) // "Matcha"

위 코드에서 Drink 클래스의 인스턴스 favoriteDrink와 secondFavorite는 힙 영역에 할당됩니다.

두 변수는 동일한 메모리 위치를 참조하므로, 한 변수를 통해 다른 변수의 값을 변경할 수 있습니다.

 

스택 영역에서 함수 호출과 로컬 변수 관리

스택 영역에서 함수 호출이 발생하면, 해당 함수의 로컬 변수와 매개변수를 위한 메모리가 스택에 할당됩니다. 함수가 종료되면, 해당 함수의 스택 프레임이 해제되고, 함수 내에서 사용된 모든 로컬 변수와 매개변수는 자동으로 메모리에서 해제됩니다.

func addNumbers(a: Int, b: Int) -> Int {
	let sum = a + b
    return sum
}
let result = addNumbers(a: 5, b: 10)
print(result) // 15

위 코드에서 addNumbers 함수 내의 sum 변수는 스택 영역에 할당됩니다. 함수가 종료되면, sum 변수는 자동으로 스택에서 해제됩니다.

 

 

정보 출처: phind