[iOS] final 키워드 사용하는 이유?

Han's·2023년 7월 17일
0

TIL

목록 보기
2/20
post-thumbnail

이때까지 명시적으로 상속을 할 필요가 없을 때 사용을 하고 있었지만, 성능적으로도 이점이 있다는 것을 알게 되었습니다.

성능적 이점이라... 어떻게 성능이 좋아진다는 말일까요? 성능상의 이점이 어떤 것인지 이해하기 위해 먼저 VTable에 대해 알아보겠습니다.

VTable 이란?

VTable은 Swift 및 다른 객체 지향 언어에서 클래스의 가상 함수를 저장하고, 해당 클래스의 인스턴스가 만들어질 때 메모리에 할당됩니다.
각 클래스는 해당하는 VTable을 가지며, VTable에는 해당 클래스의 가상 함수에 대한 포인터들이 저장됩니다.
클래스의 인스턴스가 생성될 때, 해당 클래스에 대한 포인터가 인스턴스의 메모리에 저장되며, 이를 통해 VTable에 접근하여 가상 함수를 호출할 수 있습니다.

VTable은 Swift의 다형성과 동적 디스패치의 기반을 제공하며, 객체 지향 프로그래밍에서 상속과 다형성을 구현하는 핵심 개념 중 하나입니다.

  • Static Dispatch(정적 디스패치)
    컴파일 시간에 함수 호출에 대한 결정이 이루어지는 방식
    컴파일러가 함수 호출의 위치에서 정확한 함수를 직접 호출하는 것을 의미합니다.
    정적 디스패치는 성능 면에서 이점이 있으며, 함수 호출의 오버헤드가 낮아집니다.

  • Dynamic Dispatch(동적 디스패치)
    런타임 시간에 함수 호출에 대한 결정이 이루어지는 방식
    동적 디스패치는 객체의 실제 타입을 확인하고 해당 타입의 메서드를 호출합니다.
    객체의 실제 타입을 확인하고 해당 타입의 메서드를 호출합니다.

따라서

final을 사용하면 상속이 불가하고 이 말인즉, 오버라이딩 할 수 없다.
따라서 동적 디스패치가 아닌 정적 디스패치동작하게 되면서 컴파일 타임에 호출할 메서드를 지정함으로써 성능상의 이점이 생깁니다.

profile
 iOS Developer

2개의 댓글

comment-user-thumbnail
2023년 7월 17일

좋은 글 감사합니다!

1개의 답글