final이 대체 뭘까 ??

이건준·2023년 2월 7일
0

1. 상황설명

  • 개발 리뷰중에 변하지않는 부분이 있다면 final키워드를 붙여주는것이 성능상 좋다는 팀원의 의견이 있었다

  • 사실 final에 대해 잘 모르고있었고 그냥 변하지않게 해주는 그런거구나싶어서 내가 맡고 있는 모든 파일에 final을 붙여주었다

2. 문제발생

  • 위와 같은 상황속에 클릭할때마다 이미지가 바뀌어야하는 ToggleButton이 런타임도중 동작하지않게 되었다

  • 여러 시행착오끝에 final이란 키워드때문이란걸 알았는데 대체 이 final이 뭔지 알아보자

final이란 ??

  • 더이상 상속하지않음을 의미

  • 오버라이드할 시 컴파일에러를 발생하게 만들 수 있음

  • 런타임 성능이 향상

-> 위 3가지가 보통 final의 특징이라 일컽는다

final 키워드를 붙인 method, property, subscript 를 서브클래스에서 오버라이드하면 컴파일타임 에러가 발생

class 전체에 대해 final 키워드를 붙이는 경우 서브클래스를 만드려고 하면 컴파일타임 에러가 발생

그럼 왜 final로 선언하면 런타임 성능이 향상될까 ??

1. Static Dispatch vs Dynamic Dispatch

  • Dispatch 는 어떤 메소드를 호출할지 결정하고 실행하는 매커니즘

Static Dispatch

  • 컴파일 타임에 실제 호출할 함수를 결정하는 방식

  • 함수 호출이 간단하고 속도가 빠르다

  • Value type 인 구조체와 열거형을 기본적으로 오버라이딩되지 않으므로 Static Dispatch를 이용

Dynamic Dispatch

  • 런타임에 호출될 함수를 결정하는 방식

  • 함수 호출 과정에서 실제 참조할 요소를 찾는 과정이 있어 Static 에 비해 속도가 느리다.

  • 클래스마다 함수 포인터들의 배열인 vtable(Virtual Dispatch Table)을 갖고 있으며 이를 참조해 실제 호출할 함수를 결정

-> 즉 어떤 클래스를 상속해 특정 함수를 오버라이딩한다면 그 과정의 결과로 Dynamic Dispatch방식으로 호출하게 된다

오버라이딩하게된다면 컴파일타임에서 어떤 메소드를 호출해야될지 모르기때문이죠

만약에 오버라이딩이 반드시 필요하다면 Dynamic Dispatch방식이 불가피하겠지만 그렇지않다면 Static Dispatch방식을 지향하는것이 런타임성능에 유용한 것이다

그렇다면 Dynamic Dispatch방식이 필요하지않는 경우 어떻게 할 수 있을까 ??

  • final로 선언함으로써 해당 함수 혹은 프로퍼티 등등은 오버라이딩 불가하기에 컴파일러는 Dynamic Dispatch방식을 사용하지않아도 되게된다

  • private으로 선언하면 해당 요소는 한 파일 내부에서만 사용됨이 보장된다, 즉 해당 파일 내부에서 오버라이딩된게 없다면 Static Dispatch방식을 유도할 수 있다

참고사이트: [Swift] final 키워드는 언제 사용할까?

0개의 댓글