티스토리 뷰
728x90
반응형
Reference / Value / Protocol Type 의 Extension 할 경우 dispatch 방법이 달라지기도 합니다. 알아봅시다!
value type 의 extension 에서 구현한 메소드는 상속 가능성이 없기 때문에 static dispatch 로 동작.
reference type 의 extension 에서 구현한 메소드는 서브 클래스에서 재정의가 불가능하다.(이를 위해서는 @objc 를 통해 해결할 수 있다.) 그래서 extension 의 메소드가 호출되는 것이 보장되기 때문에 static dispatch 로 동작.
protocol 의 extension 에서 구현한 메소드는 두 가지로 나뉜다.
1.extension 에 default 구현을 해둔 경우는 해당 메소드에 대한 구현이 필수적이지 않기 때문에 dynamic dispatch 로 동작.
protocol A { func sayA() } extension A { // default 구현 func sayA() { print("A") } }
2.protocol 에 없는 메소드를 extnesion 으로 구현했고, 상수, 변수의 타입이 해당 protocol 이라면 동일한 이름의 메서드가 구현되어 있어도 해당 protocol 에 대한 메소드가 호출되어서 static dispatch 로 동작.
protocol Human { } extension Human { func sayHello() { print("Hello Human!") } } class Student: Human { } class Teacher: Human { func sayHello() { print("Hello Teacher!") } } // Human 타입의 변수 a 는 static dispatch 로 호출. var a: Human = Student.init() a.sayHello() // ✅ Hello Human! a = Teacher.init() a.sayHello() // ✅ Hello Human! // Teacher 클래스 내에서 선언한 메서드 호출. let b: Teacher = Teacher.init() b.sayHello() // ✅ Hello Teacher! // (class 에서 선언함. 별도의 final 키워드가 없기 때문에 상속을 통한 오버라이딩 여지가 있다고 판단하여 dynamic dispatch 로 호출.) // 출처 : https://babbab2.tistory.com/144?category=828998
출처
728x90
반응형
'iOS' 카테고리의 다른 글
iOS) 강한 순환 참조(Strong Reference Cycle)는 어떤 경우에 발생하나요? (0) | 2023.07.12 |
---|---|
iOS) CFBundleShortVersionString 과 CFBundleVersion 차이점 (0) | 2023.07.06 |
iOS) fastlane Fastfile 설정 - match (0) | 2023.06.22 |
iOS) 비동기 함수를 호출할 때 종료 시점 Dipsatch Group 로 알기 (0) | 2023.06.19 |
iOS) Widget 으로 앱 접근 시 화면 이동 (0) | 2023.05.23 |
댓글
TAG
- IOS
- Notification
- projectsetting
- Objective-C
- Algorithm
- 2022 KAKAO TECH INTERNSHIP
- Firebase
- Swift
- Protocol
- async/await
- WWDC22
- YPImagePicker
- CloneCoding
- RxCocoa
- UserDefaults
- watchOS
- MVVM
- containerBackground
- WidgetKit
- SwiftUI
- APNS
- 서버통신
- MOYA
- Widget
- OpenSourceLibrary
- github
- urlsession
- WWDC
- rxswift
- configurable widget
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
링크
- Total
- Today
- Yesterday