이전처럼 이번에도 'Understanding Swift performance'를 보고 헷갈렸던 부분이나 궁굼증을 중심으로 정리해보겠다.
이 영상에서 Swift의 성능을 고려할 때 3가지 주요 고려 사항을 소개했다. 그 중 3번째는 "내 인스턴스의 메소드를 호출 할 때 static dispatch인가 dynamic dispatch인가"에 대한 내용이다.
Swift의 성능 향상을 위해 Method Dispatch를 잘 이해하고 있어야 한다.
프로그래밍에서 "Dispatch"는 작업의 분배, 스케중링, 처리 등을 의미한다.
그럼으로 Method Dispatch란 메서드의 호출 방법에 대한 개념이다.
정적 디스패치와 동적 디스패치는 메서드 호출을 처리하는 두 가지 다른 방식이다. 이에 대한 비교를 살펴보자.
가상 메서드 테이블(Virtual Method Table) 즉 VMT는 객체 지향 프로그래밍에서 다향성을 지원하는 메커니즘 중 하나이다. VMT는 객체의 가상 메서드들에 대한 주소를 담은 테이블이다.
클래스는 상속이 가능하기 때문에 해당 메서드가 오버라이드 되었는지 부모의 메서드인지 등을 확인하기 위해 VMT를 참조하고 조회하여 실제 호출되어야 하는 메서드를 찾아낸다.
설명을 잘 이해했다면 Dynamic Dispatch보다 Static Dispatch의 성능이 더 좋다는것을 알 수 있다.
더이상 상속이 없는 클래스의 경우 final 키워드를 통해 정의해주면 더이상 상속이 없을것임을 프로그램에 알리고 컴파일 시점에 최적화하여 Static Dispatch가 가능하다.
위의 가상 메서드 테이블(VMT)의 설명처럼 다형성을 지원하기 때문이다.
다형성을 적용하면 유연성과 확장성 ⬆️, 코드의 재사용성 ⬆️, 유지보수 용이성 ⬆️, 코드의 가독성 ⬆️, 타입의 객체 통합 등 많은 이점을 얻을 수 있다.
Swift에서 성능 고려와 함께 코드의 유연성을 유지하기 위해 이러한 디스패치 방식을 효과적으로 사용하는 것이 중요하다. 나머지 성능 향상을 위한 내용에 대해서도 다음글에 이어서 알아보자