이번 학습은 extension에서 동작하는 dispatch를 알아보자.
extension을 할 수 있는 3가지 경우는 다음과 같다.
- 값 타입에서 확장
- 래퍼런스 타입에서 확장
- 프로토콜에서 확장
각 각의 상황에서 어떤 디스패치가 동작하는 지 알아보자.
Value Type 확장 시 Dispatch
상속의 가능성이 없기 때문에, 확장(exension)을 해도 Static Dispatch로 동작한다.
struct Human {
func sayHello() {
print("Hello Human!")
}
}
extension Human {
func sayHo() {
print("Ho~~")
}
}
let human: Human = .init()
human.sayHello() // Static Dispatch
human.sayHo()
Reference Type 확장 시 Dispatch
Class를 확장(extension)하여 메서드를 추가한 경우
서브 클래스에서 오버라이딩이 불가능하다.
오버라이딩 가능성 ❌ = Static Dispatch
class Human {
func sayHello() {
print("Hello Human!")
}
}
extension Human {
func sayHo() {
print("Ho~~") // static dispatch
}
}
class Teacher: Human {
override func sayHo() { // error! Overriding non-@objc declarations from extensions is not supported
}
}
Protocol 확장 시 Dispatch
프로토콜은 총 두 가지 경우로 나눠 생각해야한다.
1) extension을 통해 default 메서드를 구현한 경우
보통 프로토콜에 명시되어 있는 메서드는 필수적으로 구현해야하지만, default 메서드를
프로토콜의 extension을 통해 구현해 놓았다면 필수적이지 않음
필수적이지 않다는게 약간 오버라이드와 비슷한 느낌이 들지 않나?
2가지 경우 의 수가 생기게 된다.
a. 구현을 했을 때
b. 구현을 하지 않고 default method를 사용할 때
어떤 것을 써야할 지 고민을 해야한다는 뜻이네 ??
고민 = Dynamic Dispatch
human이란 프로토콜 타입이 Student일 때 default 메서드가 호출되고 Teacher일 때
프로토콜을 채택하여 구현한 메서드가 호출된다. 인스턴스 별로 사용할 메서드를 고민한다.
2) Protocol에 선언되어있지 않은 메서드를 추가로 구현한 경우
프로토콜에는 정의되어 있지 않고 프로토콜 extension에 정의된 메서드를
구현할 경우 해당 프로토콜 타입에선 무조건 extension에 구현된 메서드만
실행되기 때문에 고민할 필요가 없다.
고민 ❌ = Static Dispatch
Teacher이란 클래스는 sayHello란 메서드를 자기 클래스 내에서 구현 했음에도 불구하고,
현재 human이란 변수의 타입이 Human이란 프로토콜의 타입이기 때문에
해당 프로토콜의 extension에서 구현된 sayHello 메서드만 실행됨
'프로그래밍언어 > swift' 카테고리의 다른 글
클로저와 self (0) | 2024.10.23 |
---|---|
swift 기본 타입 (0) | 2024.10.18 |
디스패치 학습하기 (3) [ Value Type Dispatch, Protocol Dispatch ] (0) | 2024.08.25 |
디스패치 학습하기 (2) [ Reference Type Dispatch, final ] (0) | 2024.08.25 |
디스패치 학습하기 (1) [ 정의, 종류, vtable, witness table ] (0) | 2024.08.25 |