안녕하세요! 이번에는 final 키워드의 성능적 이점과 그 활용 예시에 대해 알아볼게요. 또한 이를 이해하기 위해 필요한 Static Dispatch와 Dynamic Dispatch, 그리고 vtable이라는 개념에 대해서도 함께 알아보도록 해요.
📚 Dispatch란?
먼저, 디스패치(Dispatch)라는 개념을 함께 알아볼까요? 디스패치는 어떤 메소드를 호출할지 결정하고 실행하는 메커니즘을 의미하는데요. 이는 크게 Static Dispatch와 Dynamic Dispatch로 나뉘어져 있어요.
🚀 Static Dispatch
Static Dispatch는 컴파일 타임에 실제 호출할 함수를 결정하는 방식이에요. 이 방식은 함수 호출이 간단하고 속도가 빠른 편이죠. 대표적으로 Swift에서 Value Type인 구조체와 열거형이 이에 해당해요.
💡 Dynamic Dispatch
반면에 Dynamic Dispatch는 런타임에 호출될 함수를 결정하는 방식이에요. 이 방식은 함수 호출 과정에서 실제 참조할 요소를 찾는 과정이 필요해서 속도가 상대적으로 느린 편이에요. 클래스마다 함수 포인터들의 배열인 vtable을 갖고 있으며, 이를 참조해 실제 호출할 함수를 결정하게 되죠.
📘 vtable?
그럼 vtable이라는 것은 무엇일까요? vtable은 가상 메서드 테이블을 이르는 것으로, 클래스마다 가지고 있는 테이블이에요. 이 테이블은 클래스 내부의 함수들 중 어떤 함수를 호출해야할지 결정하는 역할을 합니다. 함수가 호출되면 vtable에서 현재 클래스가 어떤 함수를 호출해야 하는지 조회하고 해당 함수를 호출하는 방식을 사용해요. 이 과정은 런타임에 이루어지며 성능 측면에서 불리할 수 있죠.
🏁 Final 키워드의 활용
이제 이런 배경 지식을 바탕으로 final 키워드를 적용해볼게요. final 키워드를 붙이면 해당 메소드는 상속이 불가능하므로, 오버라이딩에 의한 Dynamic Dispatch가 필요없게 됩니다. 이로 인해 해당 키워드를 붙인 메소드는 Static Dispatch를 사용해 컴파일 타임에 호출할 메소드를 지정합니다. 이는 런타임 성능을 향상시키는 결과를 가져오게 되는거죠!
🤓 집게리아 코드 예시를 통해 살펴볼게요 :)
final class Burger {
private let patty: String
private let bun: String
init(patty: String, bun: String) {
self.patty = patty
self.bun = bun
}
func assembleBurger() {
// 버거 조립 로직
}
}
위의 코드에서 Burger
클래스에 final 키워드를 사용하였습니다. 이렇게 하면 다른 클래스에서 Burger
클래스를 상속하거나 assembleBurger
메소드를 오버라이딩할 수 없어요. 이는 컴파일 타임에 호출 경로가 결정되어 성능을 향상시킵니다. 주문이 들어온 햄버거를 만드는데, 손님들이 재료를 커스텀하게 선택하면 그에 따라 버거를 만들기 위한 과정이 복잡해지고 주문과 조리에 시간이 더 걸리잖아요? 반면에 매뉴얼대로 만들면 훨씬 빠르게 버거를 만들 수 있죠!
이상으로 final 키워드와 Dynamic Dispatch, Static Dispatch 그리고 vtable에 대해 알아보았습니다.
요약: final 키워드를 적절히 활용하면 성능 개선에 도움이 될 수 있어요!
참고 아티클:
https://jcsoohwancho.github.io/2019-11-01-Swift%EC%9D%98-Dispatch-%EA%B7%9C%EC%B9%99/
https://babbab2.tistory.com/145?category=828998
'스폰지밥으로 공부하는 swift > swift 문법' 카테고리의 다른 글
클로저 왜 씀? (0) | 2024.01.29 |
---|---|
[값타입 vs 참조타입]을 '집게리아 레시피'로 이해 해보좌 (1) | 2024.01.28 |
unowned vs weak 뭐가 다른데? (1) | 2024.01.04 |
참조, 강한참조 약한참조, 순환참조...? (0) | 2024.01.03 |
앱개발 심화 키워드 요약 (2) | 2023.12.05 |