Dispatch?
Dispatch : 어떤 메서드를 호출할 것인가를 결정하여 실행하는 과정
- Static Dispatch : 컴파일 시점에서 어떤 메소드가 사용될지 명확히 결정되는 것
- Dynamic Dispatch : 런타임 시점에 어떤 메소드가 실행될지 결정되는 것, Swift에서는 class마다 vtable이라는 것을 가지고 있어서 이를 참조하면서 함수가 호출되기 때문에 이에 따른 overhead가 발생하게 된다.
즉 Dynamic Dispatch를 하면 성능의 하락이 있을 수 있다. 따라서 이를 최대한 줄이는 것이 성능상 도움이 된다.
Swift에서의 Dispatch
Swift의 struct와 class 중 struct를 먼저 생각해보자.
struct는 값 타입이라 한 곳에서만 존재하고 상속도 없다. 따라서 컴파일러 입장에서는 이만큼 명확한 것이 없다. 어떤 메소드가 실행될지 고민할 필요도 없이 바로 실행처리가 가능하다. 따라서 Static Dispatch로 처리되며 오버헤드도 없다.
그럼 struct는 별다른 처리가 필요없을 것으로 생각된다. 그럼 이제 class에 대해 생각해보자.
class는 참조타입인데다가 상속도 가능하다. 하나의 함수가 존재해도 호출되는 위치가 여러개일수 있고, 상속이 되어 있어 다른 클래스에서 호출될 가능성도 고려해야 한다. (실제로 override되었는지 여부는 관계없이 컴파일러는 그냥 이렇게 받아들인다고 한다.) 따라서 특별하게 지정하지 않는 이상 class의 메소드는 Dynamic Dispatch로 처리된다.
그럼 어떻게 하면 class의 메소드를 특별하게 지정할 수 있을까?
Dynamic Dispatch 줄이기 (특별하게 지정하기)
1. final
해당 키워드는 클래스의 메서드와 프로퍼티에 override를 제한한다. 따라서 자연스럽게 이에 대한 접근이 direct하게 처리된다.
2. private
해당 키워드는 참조가능한 위치를 현재 파일로 제한하게 된다. 컴파일러는 해당 위치에서 override가 될 수 있는지 판단하고, 없다면 final 키워드로 추론하여 final 키워드와 동일한 효과를 얻게 된다.
3. whole module optimization
기본적으로 swift 컴파일러는 모듈별로 컴파일하기 때문에 서로 다른 파일에서 진행된 override 여부를 판단할 수 없다. 하지만 xcode 내부 에서 whole module optimization 옵션을 추가하면 빌드시 모든 파일을 분석해 한번에 최적화를 진행한다. 따라서 final 여부를 추론할 수 있게되면서 final을 붙였을 때와 같은 효과를 얻을 수 있게 된다.
'🍎 Apple > Swift' 카테고리의 다른 글
[Swift] 문자열 처리 (0) | 2022.01.22 |
---|---|
[Swift] NSCache와 NSDictionary의 차이점 (0) | 2022.01.22 |
[Swift] UserDefaults와 Codable, NSCoding (2) | 2022.01.01 |
[Swift] Codable Protocol (2) | 2021.09.02 |
[Swift] 기초 문법 정리 (0) | 2021.07.18 |