본문 바로가기
면접 스터디

면접스터디 : Class의 성능을 향상시킬 수 있는 방법들을 나열

by iOS 개린이 2022. 12. 28.

Class의 성능 향상에 도움을 주는 방법들

1. 서브클래싱이 필요하지 않은 Class라면 Class 선언 시 앞에 final 을 붙여준다.

-final을 붙여주면 Class의 성능이 향상된다고 하는데, 이 이유는 Swift의 Dispatch에 대해 알아야 이해가 가능하다.

-Dispatch는 GCD가 사용하는 Queue인 DispatchQueue와 다른 개념으로 "프로그램이 어떤 메소드를 호출할 것인지 결정하고, 그 메소드를 실행하는 매커니즘" 을 뜻한다.

 

 

Dispatch에는 Static Dispatch와 Dynamic Dispatch가 있다.

1. Static Dispatch

-컴파일 타임에 호출될 메소드를 결정하여 런타임 때 실행한다.

-컴파일 타임에 컴파일러가 메소드가 작성된 코드 위치를 파악한 후, 런타임에 바로 메소드를 실행한다. 

미리 코드 위치를 파악했기 때문에 메소드 인라이닝이 가능하다. (메소드 인라이닝이란 메소드를 호출할 때 그 위치로 이동하지 않고 바로 결과값을 리턴받아 성능을 향상시키는 것이다.)

 

2. Dynamic Dispatch

-런타임에 호출될 메소드를 결정한다.

-컴파일 시점에 호출될 메소드가 어떤 것인지 알 수 없기 때문에 Swift에서는 Class마다 함수 포인터들의 배열인 vTable(Virtual Dispatch Table)을 유지한다. 

-하위클래스에서 상위의 메서드를 호출할 때 vTable을 참조해서 호출할 메서드를 결정한다.

-이 과정들이 런타임 시점에 진행되기 때문에 성능이 떨어진다.

 

 

그래서 Dynamic Dispatch가 Static Dispatch에 비해 성능이 떨어진다. 

final과 무슨 관련이 있는 것인가?

-Dynamic Dispatch는 하위클래스에서 상위의 메서드를 호출하기 위해 vTable을 참조해야 한다고 했는데, 이것은 결국 상속과 오버라이딩의 가능성이 존재한다는 것과 같다.

상속과 오버라이딩의 가능성이 있는 Class라면 Dynamic Dispatch로 런 타임에 vTable을 참조해서 호출할 메소드를 결정해야 하기 때문에 성능이 떨어진다 -> 해결: 상속과 오버라이딩의 가능성을 없애주면 된다.

 

Class 앞에 final 키워드를 붙여주면 상속이 불가능한 Class가 되면서, Class내의 모든 프로퍼티나 메서드가 Static Dispatch로 동작하게 되고 성능이 향상되는 것이다.

 

 

2. 파일 내에서만 접근해도 되는 경우, 선언 시 앞에 private 키워드 붙여준다.

-private 키워드를 붙여주면, 접근이 파일 내에서만 가능하다. 

-private 키워드를 붙여주면 컴파일러는 접근이 가능한 구역 내에서 오버라이딩이 가능한지 판단하고, 만약 오버라이딩이 필요하지 않다면 final로 인식하면서 Static Dispatch로 동작하게 된다.

 

 

Tip : final은 Class 뿐만 아니라 프로퍼티나 메소드 앞에도 붙이는게 가능하다. 만약 class에 붙이지 않고, 프로퍼티에만 final을 붙여주었다면 프로퍼티만 Static Dispatch 로 동작한다.

 

 

Reference : 

iOS. class의 성능을 향상 시킬수 있는 방법들을 나열해보시오. (velog.io)

Class의 성능 향상 방법 (velog.io)

Swift) Dispatch를 이용한 성능 최적화 (tistory.com)