메서드, 프로퍼티, 서브스크립트 앞에 final키워드를 사용함으로써 override를 방지할 수 있다.
final 키워드를 사용한 경우 더이상 상속이 필요없음을 명시할 수 있고, 상속한 class에서 override를 방지할 수 있습니다.
Apple github에 있는 최적화 내용 중 final사용이 성능을 개선시켜준다는 내용이있습니다.
Swift 는 기본적으로 매우 dynamic한 언어이다.
먼저 Dispatch는 내가 호출할 함수를 컴파일 타임에 결정하냐, 런타임에 결졍하냐에 따른 방식이다.
static Dispatch(direct)
컴파일 타임에 호출될 함수를 결정하여, 런타임 때 그대로 실행한다. 컴파일 타임에 결정되기 때문에 성능상 이점을 가질 수 있다.
dynamic Dispatch(indirect)
런타임에 호출될 함수를 결졍한다, Swift에서는 클래스마다 함수 포인터들의 배열인 vTable우지한다.
하위 클래스가 메서드를 호출할 대, 이 vTable을 참조하여 실제 호출할 함수를 결졍한다. 이과정들이 런타임에서 일어나기 때문에 성능상 손해를 보게 된다.
Dynamic Dispatch는 왜 사용할까?
reference type의 class는 상속의 가능성이 있어 서브 클래스에서 함수를 호출할 수 있기에(overriding) Dynamic Dispatch를 사용한다.
컴파일러는 런타임 시점에 하위 클래스에서 오버라이딩이 될 경우를 대비해 상위클래스의 메서드를 참조할지 하위클래스의 메서드를 참조할지를 확인하는 작업을 해야함
어떤 함수는 각 클래스마다 가지고 있는 vTable이란 것 안에 함수 포인터로 두고 실제 런타임 시점에 이 vTable을 사용하여 어떤 메서드가 불리는지를 결정해버림.
런타임 과정에 해당 클래스의 vTable에서 함수를 찾아 메모리 주소를 "읽고", 그 주소로 "점프"해야 하기 때문에 두 개의 추가 명령이 필요해서 성능상 손해를 보는 것임! (하위 클래스메서드에서 상위 클래스 메서드로)
value Type인 구조체, 열거형은 상속을 할 수 없다는 특징 때문에 오버라이딩이 될 가능성이 없어, Static Dispatch를 사용한다.