일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이것이나의다정입니다
- async
- Combine vs Async/Await
- await
- The Composable Architecture
- Concurrency Programming
- architecture
- combine
- swift
- @ObservedObject
- ScrollViewReader
- @StateObject
- Custom URL Scheme
- ios
- SFSafariView
- Universal Link
- AnyCancellable
- ScrollViewProxy
- @NameSpace
- Dynamic Dispatch
- App Thinning
- SwiftData
- fileprivate
- SwiftUI
- wwdc23
- @main
- async/await
- MVVM
- matchedGeometryEffect
- Static Dispatch
- Today
- Total
홍로그
Swift final을 쓰는 이유 본문
final
Swift는 class의 상속과 overriding을 지원함.
class나 method, property에 final 키워드를 붙이면 상속이나 overriding을 막을 수 있음.
vtable
Virtual Dispatch Table.
class 내부의 method들 중 어떠한 method를 호출해야 할지 결정하는 테이블.
class가 상속될 수도 있고 overriding 가능성도 있기 때문에 부모 class의 method를 참조해야 할지 하위 class의 method를 참조해야 할지 확인해야 함. 이러한 과정이 런타임 시기에 vtable을 통해 이루어짐.
Dynamic Dispatch
method가 overriding 되어있는 경우 실행 시점에 유동적으로 어떤 method와 property를 호출할지 런타임 시기에 결정하는 방법.
method를 vtable에서 간접적으로 호출.
Swift는 기본적으로 Dynamic Dispatch 방법을 사용하지만 런타임 시기에 호출을 결정해야 하는 경우가 많아지면 성능이 떨이지기 때문에 애플에서도 Dynamic Dispatch를 최대한 줄이라고 권장하고 있음.
Static Dispatch
Dynamic Dispatch와는 반대로 컴파일 시기에 이미 어떤 method와 property를 호출할지 결정되어 있는 방법.
런타임 시기에 결정하는 과정이 없어서 Dynamic Dispatch보다 성능상으로 이점이 있음.
final을 사용하는 이유
결론적으로
Swift는 대부분 Dynamic Dispatch 방법으로 vtable을 통해 class가 상속되어있는지, overriding 되어있는지 확인하고 어떤 method를 실행할지 런타임 시기에 결정함. 이런 overhead로 인해 성능 저하를 야기함.
이를 해결하기 위해 final 키워드를 사용함으로써 상속과 overriding을 막고 Static Dispatch 방법을 사용해 컴파일 시기에 이미 어떤 method를 실행할지 결정하여 성능을 향상할 수 있음.
'iOS' 카테고리의 다른 글
Swift Combine (0) | 2023.05.27 |
---|---|
inout / mutating (2) | 2023.05.26 |
UIWebView, WKWebView, SFSafariView 차이 (2) | 2022.10.25 |
메모리 순환 참조 방식 ( Strong, Weak, Unowned ) (2) | 2021.04.18 |
iOS ARC (Automatic Reference Counting) (0) | 2021.04.18 |