📱 iOS, Swift

[iOS][Swift] Final 키워드에 관한 문법적 의미와 성능적 관점

itllbegone 2022. 1. 24. 19:52

iOS 개발자로 면접을 진행하던 와중에 다음과 같은 질문을 받았습니다.

 

🧑🏻‍💻 프로젝트에서 final 키워드를 모든 class에 다 붙여 두셨는데 이유가 있나요?
🧑🏻‍💼 더이상의 상속을 하지 않겠다는 의미로 final 키워드를 모두 붙여주었습니다!
🧑🏻‍💻 그렇다면 final 키워드를 사용함으로써 상속을 막는것 이외에 다른 장점은 무엇이 있을까요?
🧑🏻‍💼 ...!

 

해당 질문을 받았을 때 정확히 알고있는 개념이 아니라서 컴파일 시간을 단축할 수 있겠다는 추측성 대답을 했는데 알고보니 이상한 대답을 한 것 같다ㅠㅠ

 

그래서 final을 쓰면 뭐가 좋은데?

  1. 문법적 의미
  2. 성능적 이점

final 키워드를 사용하면 위에서 언급한 상속을 막는것과 같은 문법적(컴파일이 안되는)의미와 더불어 성능적으로도 이점을 볼 수 있다는 것을 알았는데, 하나씩 살펴보도록 합시다!


문법적 의미

문법적인 의미의 final은 컴파일이 불가능 하다
  • 상속 불가

기본적으로 class 앞에 final이 붙게 되면 다른 class에서 상속이 불가능해 진다!

최종_최종_이력서.jpg

  • override 불가

이외에 프로퍼티, 메소드 등에 final이 붙게 되면 override가 불가능 하게 된다!

 

성능적 이점

런타임 시기에 성능적 이점을 가질 수 있으며, Static Dispatch와 Dynamic Dispatch의 차이를 알아야 하지만 이것들을 알기 전에 vTable을 먼저 알아야 합니다

 

vTable이란?

Swift는 클래스마다 vTable을 가지고 있는데 클래스 내부의 함수들 중 어떠한 함수를 호출해야 할지 결정하는 테이블을 이야기 합니다.

즉 함수가 호출되면 vTable에서 지금 class가 어떠한 함수를 호출해야 하는지 조회를 하고 해당 함수를 호출하는 방식인거죠!

왜냐하면 함수가 오버라이딩 될 수 있는 가능성이 있기 때문에 상속받은 함수를 호출해야 할지, 오버라이딩 한 함수를 호출해야 할지 누군가는 알려주어야 하니까요!

이러한 과정이 런타임 때 이루어지며 이는 당연히 성능 측면에서 불리할 수 밖에 없습니다

 

Dynamic Dispatch

이름에서 알 수 있듯이 유동적으로 어떤 메소드와 프로퍼티를 호출할지 결정하는 방법입니다. 즉 런타임에 결정된다는 말이에요! (Swift는 기본적으로 해당 방법을 사용하고 있어요!)

Static Dispatch

Dynamic Dispatch와는 반대로 컴파일 시기에 이미 어떠한 메소드와 프로퍼티를 호출할지 결정되어 있습니다. 그러므로 Dynamic Dispatch처럼 결정하는 과정이 없으니 성능상으로 이점이 있겠죠?


결론

이렇게 final 키워드가 미치는 영향에 대해서 알아보았습니다! 단순히 상속을 막기 위한 용도로 사용했던 final이 이러한 이점이 있는줄은 몰랐었네요.. 

⭐️ 추가적으로 final 키워드 뿐만 아니라 private 또한 다른 곳에서 override를 하지 않으면 컴파일러가 알아서 Static Dispatch처럼 동작한다고 하네요! 접근제한자의 역할 뿐만 아니라 이러한 이유에서라도 private를 습관화 하는게 좋다는 생각이 드네요!

참고

https://jellysong.tistory.com/122

 

[Swift] final 키워드는 언제 사용할까?

Swift 에서는 다른 언어와 비슷하게 클래스를 상속해 서브클래스를 구현할 수 있어요. 만약, 해당 클래스가 더이상 상속이 필요없거나 특정 속성은 오버라이드하지 않아야 한다면 어떻게 해야할

jellysong.tistory.com

https://jcsoohwancho.github.io/2019-10-11-Dynamic-Dispatch%EC%99%80-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94/

 

Dynamic Dispatch와 성능 최적화

많은 객체 지향 언어들이 메소드와 프로퍼티들을 오버라이드 할 수 있도록 허용합니다. Swift도 예외는 아닙니다. 그런데 이렇게 오버라이드를 할 경우, 프로그램은 실제 호출할 함수가 어떤 것

jcsoohwancho.github.io

https://jcsoohwancho.github.io/2019-11-01-Swift%EC%9D%98-Dispatch-%EA%B7%9C%EC%B9%99/

 

Swift의 Dispatch 규칙

지난 포스트에서 Dynamic Dispatch를 피해서 성능 최적화를 하는 방법을 알아보았습니다. 하지만 swift가 Dynamic Dispatch만 사용하는 것은 아닙니다. Swift는 다양한 Dispatch 방식을 사용하는데, 이번 포스

jcsoohwancho.github.io