개발일기/Swift
[Swift] final 키워드 왜 쓰는거냐
코딩하는빵친자
2025. 1. 10. 09:13
iOS 개발자라면 한 번씩 써봤을 final 키워드!
근데 왜 쓰는지 알고 계신가요?
저도 단순히 상속이 불가능한 클래스가 있으면 그냥 final을 썼는데요...
하지만 여기서 든 의문점은 굳이 왜 이 키워드를 쓰는걸까?? 장점이 뭘까??
그래서 final키워드를 왜 쓰는지 알아봅시돠
우선 swift공식문서에서 final을 어떻게 설명하고 있는지 볼까요?
서브 클래스에서 특정 메서드, 프로퍼티 등이 오버라이드 되지 않도록 하기 위해서 final키워드를 사용한다.
final키워드를 붙인 메서드나 프로퍼티를 서브클래스에서 오버라이드하면 컴파일 에러가 발생한다.
클래스 전체에 대해 final키워드를 붙이고 서브클래스를 만드려고 하면 컴파일 에러가 발생한다.
Documentation
docs.swift.org
여기까지는 우리가 흔히 알고 있는 내용이쥬?
근데 이 final키워드를 쓰면 런타임 성능이 향상된다고 합니다
엥 갑자기 런타임 성능향상은 머람...
이 장점을 알기 위해서는 먼저 동적 디스패치, 정적 디스패치에 대해 알아야합니다.
여기서 디스패치란 어떤 메서드를 호출할지 결정하고, 실행하는 매커니즘입니다.
정적디스패치란?
- 컴파일 시점에 실제 호출할 함수를 결정하는 방식
- 함수 호출이 간단하고 속도가 빠르다.
- 값 타입인 구조체와 열거형은 기본적으로 오버라이딩이 불가능하기 때문에 정적 디스패치를 이용한다.
동적디스패치란?
- 런타임에 호출될 함수를 결정하는 방식
- 함수 호출과정에서 실제 참조할 요소를 찾는 과정이 있어서 정적 디스패치보다 속도가 느림
- 클래스마다 함수 포인터들의 배열인 vtable을 갖고있어서 이를 통해 실제 호출할 함수를 결정
그렇기 때문에 클래스를 상속해서 메서드를 오버라이딩하게되면, Swift는 일반적으로 동적 디스패치를 사용해서 런타임 시 어떤 메서드를 호출할지 결정한다고 합니다!
결론적으로, final키워드를 붙인 메서드는 정적 디스패치를 사용하게 해주기 때문에 런타임 성능이 향상되는것입니다!
728x90