Reference Type에서의 Dispatch
대표적으로 class는 상속 가능성이 있다.
따라서 서브 클래스에서 함수를 호출할 수 있기 때문에 이 때 Dynamic Dispatch를 사용한다.
아래 코드는 다음과 같은 구조를 같는다.
여기서 cat은 Animal(상위) 타입으로 되어있지만 Cat 인스턴스를 업캐스팅해서 가르키고 있는 상황이다.
이때는 Animal의 speak를 참조해야하는 것이 아니라 Cat의 speak를 참조해야한다.
이처럼 오버라이딩의 가능성이 있으면 어떤 함수가 실행되야할지는 런타임 때 알 수 있기 때문에 vtable을 무조건 참조해야하고 이런 동작을 Dynamic Dispatch라고 부른다.
그렇다면 상속으로 인한 오버라이딩의 가능성이 Dynamic Dispatch를 야기한다면 상속을 막아버린다면 어떨까 ??
이 때 등장하는 것이 final 키워드이다.
final
역할
서브클래스에서 특정 method, property, subscript 가 오버라이드 되지 않도록 하기위해서 사용되며
만약 오버라이드 한다면 컴파일 에러가 발생한다.
특징
1) 클래스에 final을 사용할 경우 상속 불가
2) 함수에 final을 사용할 경우 오버라이드 불가
예시 코드
1) 클래스에 final을 사용할 경우 상속 불가
final class LastResume {
var text = "마지막 수정본"
func edit() {
self.text = "최종 이력서"
}
}
class LastLastResume : LastResume { // 클래스 자체에 final이 붙혀있어서 상속 자체 불가 ❌
}
2) 함수에 final을 사용할 경우 오버라이드 불가
class LastResume {
var text = "마지막 수정본"
final func edit() {
self.text = "최종 이력서"
}
}
class LastLastResume : LastResume {
override func edit() { // 함수에 final이 붙혀있어서 상속 자체 불가 ❌
self.text = "최종 최종 이력서"
}
}
정리
위에서 공부했던 것처럼 Reference Type이 클래스는 상속 가능성이 있기때문에 기본적으로
Dynamic Dispatch을 이용 하지만 final 키워드를 사용하면 애초에 상속자체를 막기 때문에
Dynamic Dispatch 과정이 필요 없음을 명시해줄 수 있다.
해당 키워드를 붙인 메소드는 Static Dispatch 를 사용해 컴파일 타임에 호출할 메소드를
지정함으로 런타임 성능이 향상된다.
'프로그래밍언어 > swift' 카테고리의 다른 글
디스패치 학습하기 (4) [ Extension Dispatch ] (0) | 2024.08.26 |
---|---|
디스패치 학습하기 (3) [ Value Type Dispatch, Protocol Dispatch ] (0) | 2024.08.25 |
디스패치 학습하기 (1) [ 정의, 종류, vtable, witness table ] (0) | 2024.08.25 |
접근 제한자 (0) | 2024.08.25 |
property 학습하기 (4) [ Property Observer ] (0) | 2024.08.25 |