[Swift] Final 키워드의 성능 향상

마이노·2023년 4월 20일
0

이전까지 제가 알고있던 지식은 class 앞에 final 키워드를 넣으면 상속이 불가능하다! 까지 아주 얕게 알고 있었습니다. 같이 프로젝트를 했던 팀원 중 한명이 final을 붙이면 컴파일이 좀 더 빨라져요! 라는 말에 궁금해서 찾아보며 작성한 글입니다.

final을 배우기 전 Method Dispatch를 알아야 할 필요가 있습니다. 크게 2가지 타입으로 나눌 수 있는데요, Static과 Dynamic입니다.

클래스는 참조(reference)타입이고 구조체,열거형은 값(value) 타입임을 알고 계신다면 이해에 도움이 됩니다.

Static Dispatch

전화를 걸기 전 생각을 합니다. 친구집에 친구밖에 없는 시간을 알고 전화를 걸면 당연히 친구가 전화를 받겠구나!

컴파일되는 시점에서 어떤 메서드가 실행되는지 알고 있는 것을 바로 Static Dispatch라고 합니다.

어떤메서드가 실행되는지 안다는 것은 컴파일되는 속도가 빠르다는 것을 의미합니다.

하지만 단점도 존재하는데 서브클래싱이 불가능하다는 것입니다. 여기서 값 타입은 이러한 단점을 극복할 수 있습니다. 애초에 상속이 불가능해서 서브클래스 생성을 할 수 없기 때문입니다.

따라서 SwiftUI는 구조체로 뷰를 그리고 UIKit은 클래스로 뷰를 그리기 때문에 속도에서 Static Dispatch방식인 SwiftUI가 빠를 수 밖에 없습니다.

Dynamic Dispatch

일단 전화를 겁니다. 친구집에 전화를 걸었더니 친구 어머니가 받으십니다. 곧 바꿔주신대서 기다렸더니 잠시 후 친구가 전화를 받았습니다.

반면 컴파일 시점이 아닌 런타임 시점에서 메서드 실행을 유추하는 것이 Dynamic Dispatch입니다.

aClass.hello()라는 함수가 있습니다. aClass의 type으로 이동을 하고 해당되는 클래스의 vTable에서의 주소값을 찾아 메서드를 실행하게 됩니다.

이 과정이 런타임을 하는과정에서 수행이 되기 때문에 Static Dispatch에 비해 참조해 찾아가는방식이 추가되므로 비용(overhead)이 발생하게 됩니다. 당연하게도 Static Dispatch에 비해 느립니다.

언제쓸까??

그렇다면 클래스를 사용할 때 final키워드는 언제 사용해야 할까요?

참조타입인 class를 사용할 때 상속을 받지 않는다면 final 키워드를 붙여줄 수 있습니다. final 키워드를 붙여줌으로써 컴파일러가 오버라이딩 되지 않는다는 것을 알고있다면 Static Dispatch로 바꿔줄 수 있습니다.

참고자료

https://jcsoohwancho.github.io/2019-11-01-Swift%EC%9D%98-Dispatch-%EA%B7%9C%EC%B9%99/
https://jeonyeohun.tistory.com/343
https://onemoonstudio.tistory.com/7
https://limjs-dev.tistory.com/127?category=987291

profile
아요쓰 정벅하기🐥

0개의 댓글