YagomCareerStarterCamp-6 / Interview-study-in-swift

1 stars 0 forks source link

[2주차] Q2_class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오. #5

Open ZZBAE opened 1 year ago

kiwi1023 commented 1 year ago

class는 상속이 가능하기 때문에 하위클래스에서 메서드가 오버라이드 될 가능성이 존재한다. 그렇기 때문에 Dynamic Dispatch 방식으로 메서드를 호출한다. Dynamic Dispatch는 런타임시에 일어나기 때문에 성능상 손해를 보게 된다.

하지만 final 키워드를 붙여주게 되면 상속의 가능성을 배제할 수 있기 때문에 Static Dispatch로 함수를 호출하게 된다. 결과적으로 컴파일 타임에 함수를 호출하게 되고, 성능은 올라가게 된다.

또한 private 키워드를 사용할 경우 참조할 수 있는 곳이 현재 파일로 제한 되기 때문에 컴파일러는 자동적으로 private 키워드가 참조될 수 있는 곳에서 오버라이딩이 되는지 안되는지 판단 가능하다.

쉽게 말해 private키워드가 있는 객체는 final 키워드가 없더라도 오버라이딩이 되지 않고 있다면, 자동적으로 static dispatch로 동작한다.

Judy-999 commented 1 year ago

Swift의 클래스는 선언된 메서드와 속성을 재정의할 수 있습니다. 이는 곧 프로그램이 런타임에 참조될 메서드 또는 속성을 결정라는 "동적 디스패치"로 런타임 오버헤드가 발생합니다.

알고 있는 방법은 3가지로 아래와 같습니다.

  1. 재정의할 필요가 없음을 아는 경우 final을 사용하기
  2. 한 파일 내에서만 참조되는 선언에는 private으로 final 유추되도록 하기
  3. Whole Module Optimization을 사용해 internal 선언에서 final 추론하기
Groot-94 commented 1 year ago

재정의가 일어나지 않는다면 final 키워드를 사용하고, 은닉화를 생활화하기