[swift] unowned 참조의 동작 방식

Swift에서는 강한 참조 사이클을 방지하기 위해 weakunowned 키워드를 제공합니다. 이 문서에서는 unowned 참조의 동작 방식에 대해 알아보겠습니다.

unowned 키워드란?

unowned 키워드는 참조하는 객체가 해제되더라도 참조를 유지하는 것을 의미합니다. 이는 weak 참조와 달리 참조가 해제될 경우에는 자동으로 nil로 설정되지 않습니다.

class Person {
    let name: String
    // unowned로 선언된 속성
    unowned let car: Car
    
    init(name: String, car: Car) {
        self.name = name
        self.car = car
    }
}

class Car {
    let model: String
    
    init(model: String) {
        self.model = model
    }
}

var car: Car? = Car(model: "Tesla")
var person: Person? = Person(name: "John", car: car!)
// 참조 사이클 발생
car = nil
person = nil // 런타임 에러 발생

위의 예제에서 Person 클래스의 car 속성은 unowned로 선언되어 있습니다. car 인스턴스가 제거되면 person 객체도 자동으로 제거될 것이라고 기대할 수 있지만, 실제로 person을 해제할 때 런타임 에러가 발생합니다.

이는 unowned 참조가 참조하고 있는 객체가 이미 제거된 상태에서 참조를 해제하려고 할 때 발생하는 문제입니다.

사용 시 주의할 점

unowned 참조는 참조하고 있는 객체가 필요한 동안만 유효한 경우에만 사용해야 합니다. 만약 참조하고 있는 객체가 이미 제거된 상태에서 참조를 해제하려고 하면 런타임 에러가 발생합니다.

따라서 unowned 참조를 사용할 때에는 해당 참조가 항상 유효한지 신중하게 검사해야 합니다.

요약

unowned 참조는 참조하고 있는 객체가 이미 제거된 상태에서 참조를 해제하려는 경우에 주의해야 합니다. 항상 참조의 유효성을 확인하는 것이 중요합니다.