'final' 키워드를 사용하면 해당 클래스, 메서드나 프로퍼티는 더이상 오버라이드할 수 없게 된다. 이로 인해 컴파일러는 해당 메서드의 최종 버전을 알 수 있으므로, 런타임에 어떤 메서드를 호출할지 결정하는 추가적인 비용 없이 직접 해당 메서드를 호출할 수 있게 된다. 이를 다이렉트 디스패치 라고 한다.
다이렉트 디스패치는 성능 최적화에 도움을 준다. 런타임에서 디스패치 테이블을 조회할 필요가 없기 때문에 메서드 호출이 더 빠르게 이루어진다. 그 반대의 개념으로는 동적 디스패치가 있다.
Swift에서 클래스의 메서드는 기본적으로 동적 디스패치를 사용한다. 동적 디스패치는 런타임에 메서드를 결정하고 호출하는 메커니즘이다.
이는 Objective-C의 런타임 동작과 유사한데, 이는 메서드의 실제 구현을 찾기 위해 'vtable' 이나 'witness table' 과 같은 디스패치 테이블을 사용한다는 의미이다. 이러한 테이블은 메서드의 이름과 그 메서드의 실제 구현 간의 매핑을 제공한다.
동적 디스패치는 런타임에 메서드의 구현을 찾아내어 호출하는 메커니즘이며, 디스패치 테이블을 사용해 이 작업을 수행한다. 반면, 'final' 키워드는 메서드에 대한 추가적인 오버라이드를 방지하여 컴파일러가 그 메서드의 구현을 컴파일 타임에 알 수 있게 해, 다이렉트 디스패치를 가능하게 한다. 이로 인해 성능이 향상될 수 있다. 또한 실제 업무에서 'final' 키워드를 최종적으로 사용하게 되며 많이 활용하는 키워드 중 하나이다.