Open ZZBAE opened 1 year ago
class는 상속이 가능하기 때문에 하위클래스에서 메서드가 오버라이드 될 가능성이 존재한다. 그렇기 때문에 Dynamic Dispatch 방식으로 메서드를 호출한다. Dynamic Dispatch는 런타임시에 일어나기 때문에 성능상 손해를 보게 된다.
하지만 final 키워드를 붙여주게 되면 상속의 가능성을 배제할 수 있기 때문에 Static Dispatch로 함수를 호출하게 된다. 결과적으로 컴파일 타임에 함수를 호출하게 되고, 성능은 올라가게 된다.
또한 private 키워드를 사용할 경우 참조할 수 있는 곳이 현재 파일로 제한 되기 때문에 컴파일러는 자동적으로 private 키워드가 참조될 수 있는 곳에서 오버라이딩이 되는지 안되는지 판단 가능하다.
쉽게 말해 private키워드가 있는 객체는 final 키워드가 없더라도 오버라이딩이 되지 않고 있다면, 자동적으로 static dispatch로 동작한다.
Swift의 클래스는 선언된 메서드와 속성을 재정의할 수 있습니다. 이는 곧 프로그램이 런타임에 참조될 메서드 또는 속성을 결정라는 "동적 디스패치"로 런타임 오버헤드가 발생합니다.
알고 있는 방법은 3가지로 아래와 같습니다.
재정의가 일어나지 않는다면 final 키워드를 사용하고, 은닉화를 생활화하기
class는 상속이 가능하기 때문에 하위클래스에서 메서드가 오버라이드 될 가능성이 존재한다. 그렇기 때문에 Dynamic Dispatch 방식으로 메서드를 호출한다. Dynamic Dispatch는 런타임시에 일어나기 때문에 성능상 손해를 보게 된다.
하지만 final 키워드를 붙여주게 되면 상속의 가능성을 배제할 수 있기 때문에 Static Dispatch로 함수를 호출하게 된다. 결과적으로 컴파일 타임에 함수를 호출하게 되고, 성능은 올라가게 된다.
또한 private 키워드를 사용할 경우 참조할 수 있는 곳이 현재 파일로 제한 되기 때문에 컴파일러는 자동적으로 private 키워드가 참조될 수 있는 곳에서 오버라이딩이 되는지 안되는지 판단 가능하다.
쉽게 말해 private키워드가 있는 객체는 final 키워드가 없더라도 오버라이딩이 되지 않고 있다면, 자동적으로 static dispatch로 동작한다.