티스토리 뷰

기본적으로 Swift는 각각의 파일들을 개별적으로 컴파일한다.

MyViewController - MyView - CustomLabel

처럼 서로 상호작용을 하고 있는 것들의 연관관계를 파악해서 마치 전체 프로그램을 하나의 파일인 것처럼 컴파일을 하게 된다면 최적화할 수 있을 것이다.

 전체모듈최적화 WMO(whole module optimizations)

 

이렇게 하게 된다면 컴파일은 오래 걸릴 수 있지만 사용자가 실행할 때는 더 빠르게 실행 가능하다.

 

🤔전체모듈최적화를 더 향상 시키는 방법이 있을까?

       → 접근제어를 잘 활용해주기

 

접근 제어를 잘 활용하기 위해 접근 레벨에 대해 알아보자

AccessLevel 접근레벨
open - 다른 모듈 
public - 다른 모듈
internal - 기본값 - 모듈 내에서 접근 가능
fileprivate - 해당 파일 안에서만 사용 가능
private - 같은 scope내에서만 접근가능   

(기본적으로 접근제어자를 사용할 때, 작은 범주 안에서 큰 범주는 사용할 수 없다.
private 안에서 public X )

open과 public 차이
open
상속,  재정의(override)가 가능하다.
따라서, class에만 접근 제어 선언이 가능하다. 

public 
접근만 가능하고 상속과 재정의는 불가능하다.
class 뿐만 아니라 struct, enum에도 선언이 가능하다.

 

private

외부에서 안 쓸 함수 같은 것들을 private로 선언해서 다른 파일들과의 연관관계를 만들지 않도록 해준다.

(internal 레벨이라면 같은 모듈에 있는 모든 파일과의 연관관계를 파악해야해서 private으로 선언할 때보다 오래 걸릴 것이다.)

 

하지만 다른 모듈이라면 (라이브러리)

internal 로 잘 막아서 내 프로젝트와 라이브러리의 관계를 막아서 최적화해준다.

 

final : 상속이 안 될 거라는 걸 명시적으로 이야기 해준다.

더 이상 상속을 하지 않을 거라면 final 키워드를 사용하여 class에 대한 제약을 걸어줄 수 있다.

서로 연관관계를 파악하거나 컴파일 할 때 상속에서 처리해야하는 것을 안 하기 때문에 최적화 달성할 수 있다.

 

final 관련 Method Dispatch 참고

Method Dispatch

Dynamic dispatch (indirect call) 
런타임에 어떤 함수가 실행될 지 결정class 참조타입 클래스를 상속하고 상속하고 상속하고 상속하고 … 
슈퍼클래스의 메서드를 실행해야하는지, 내가 가진 메서드를 실행해야하는지, 내가 가진 메서드가 어디까지 영향을 미칠지 class는 알 수 없다 (어디까지 override 하고 있을지 모름)
→ 런타임 시점에 바쁘다
⇒ Static dispatch 으로 바꿔주면 성능 개선에 도움이 되지 않을까?     
    재정의가 안 되는 것은 재정의가 안된다고 표시해주자!     
    final class → 상속 x → 재정의 x → dynamic에서 static으로 바뀜 → 성능 개선

Static dispatch (direct call) 

컴파일 타임에 어떤 함수가 실행될 지 결정
구조체, 열거형 값 타입

 

댓글
최근에 올라온 글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함