개발 리뷰중에 변하지않는 부분이 있다면 final키워드를 붙여주는것이 성능상 좋다는 팀원의 의견이 있었다
사실 final에 대해 잘 모르고있었고 그냥 변하지않게 해주는 그런거구나싶어서 내가 맡고 있는 모든 파일에 final을 붙여주었다
위와 같은 상황속에 클릭할때마다 이미지가 바뀌어야하는 ToggleButton이 런타임도중 동작하지않게 되었다
여러 시행착오끝에 final이란 키워드때문이란걸 알았는데 대체 이 final이 뭔지 알아보자
더이상 상속하지않음을 의미
오버라이드할 시 컴파일에러를 발생하게 만들 수 있음
런타임 성능이 향상
-> 위 3가지가 보통 final의 특징이라 일컽는다
final 키워드를 붙인 method, property, subscript 를 서브클래스에서 오버라이드하면 컴파일타임 에러가 발생
class 전체에 대해 final 키워드를 붙이는 경우 서브클래스를 만드려고 하면 컴파일타임 에러가 발생
컴파일 타임에 실제 호출할 함수를 결정하는 방식
함수 호출이 간단하고 속도가 빠르다
Value type 인 구조체와 열거형을 기본적으로 오버라이딩되지 않으므로 Static Dispatch를 이용
런타임에 호출될 함수를 결정하는 방식
함수 호출 과정에서 실제 참조할 요소를 찾는 과정이 있어 Static 에 비해 속도가 느리다.
클래스마다 함수 포인터들의 배열인 vtable(Virtual Dispatch Table)을 갖고 있으며 이를 참조해 실제 호출할 함수를 결정
-> 즉 어떤 클래스를 상속해 특정 함수를 오버라이딩한다면 그 과정의 결과로 Dynamic Dispatch방식으로 호출하게 된다
만약에 오버라이딩이 반드시 필요하다면 Dynamic Dispatch방식이 불가피하겠지만 그렇지않다면 Static Dispatch방식을 지향하는것이 런타임성능에 유용한 것이다
final로 선언함으로써 해당 함수 혹은 프로퍼티 등등은 오버라이딩 불가하기에 컴파일러는 Dynamic Dispatch방식을 사용하지않아도 되게된다
private으로 선언하면 해당 요소는 한 파일 내부에서만 사용됨이 보장된다, 즉 해당 파일 내부에서 오버라이딩된게 없다면 Static Dispatch방식을 유도할 수 있다
참고사이트: [Swift] final 키워드는 언제 사용할까?