(iOS/Swift) 동적 디스패치(@objc dynamic)

시작하다

공식 문서에서 MapKit Annotation 예제를 볼 때

@objc 동적 변수키워드가 나타났습니다.

Realm에서 이 키워드를 본 것 같은데,

그래서 오늘은 조금 정리하고 넘어가려고 글을 조금 썼습니다.

정적/동적 디스패치

본론으로 들어가기에 앞서 차이썸에 대해 간단히 알아보도록 하겠습니다.

정적 배송

컴파일러가 컴파일 타임에 호출해야 하는

절차나 속성의 실제 위치를 미리 알기 때문에 매우 빠르게 작동합니다.

그러나 결정은 컴파일 타임에 이루어지기 때문에

상속 관계에서 오버라이드를 해도 부모 클래스의 메서드가 호출됩니다.

(매우 빠름)

동적 배송

런타임 시 호출되는 메서드 또는 속성을 결정합니다.

(수업에서만 가능)

정적 운송의 반대

런타임에 호출할 메서드를 파악하고 있으므로

상속 관계에서 재정의된 자식 클래스의 메서드를 호출할 수 있습니다.

대신 어떤 메서드가 호출되고 있는지 정확히 알지 못하므로 성능과 속도가 저하됩니다.

(상대적으로 느림)

@objc 동적

Swift는 기본적으로 정적 배송을 사용합니다.

Objective-C의 동적 디스패치 기능을 활용하는 데 사용됩니다.

Objective-C와의 상호 운용성을 유지하는 데 도움이 됩니다.

@objc 동적 변수사용할 때

동작은 속성이 변경될 때 런타임에 동적으로 결정되므로,

KVO(Key-Value Observing)를 통해 관찰이 가능합니다.

런타임 시 속성 값이 변경되면

시스템은 자동으로 속성 관찰자를 추가합니다(@objc 동적 변수) 값을 업데이트합니다.

그러나 동적으로 처리되기 때문에 컴파일러에서 속성을 최적화할 수 없습니다.

물론 성능상의 이유로 남용해서는 안됩니다.

코드를 간단히 살펴보겠습니다.

// Objective-C에서 처리를 하므로 NSObject를 상속 해줘야 합니다.
class CustomDynamic: NSObject {
    
    @objc dynamic var coordinate: CLLocationCoordinate2D
}

참조

https://zeddios.tistory.com

https://myssun0325.tistory.com