[TIL / 25.03.18] 최적화(OptimizationTips) 1

2025. 3. 18. 19:59·iOS/Swift

Private, public 의 쓰임새에 대해서 좀 더 고민하다가 같이 고민하던 분들과 같이 튜터님께 갔는데 최적화 관련 정보가 있는 링크를 받아 해석해보기로 했읍니다,,,,,

 

 

1. Whole Module Optimizations (WMO)

기본적으로 Swift는 각 파일을 개별적으로 컴파일한다고 합니다. 이를 통해 Xcode는 여러 파일을 매우 빠르게 병렬로 컴파일할 수 있는데, 단 각 파일을 개별적으로 컴파일하게 되면 특정 컴파일러 최적화를 방지할 수 있다고 합니다. (일부 최적화를 하는 데에 방해가 된다는 느낌인듯?) 이때 파일 단위로 컴파일하지 않고 모든 파일을 하나의 단위로 컴파일하는게 WMO라고 합니다.

단, 컴파일 시간이 기본모드보다 느린 점이 있지만 그만큼 최적화에 장점이 있는데 이 최적화도 항상 적용되는 건 아닙니다. 작은 프로젝트에선 솔직히 차이가 크지 않을 수 있다는 점이 있읍니다. 

 

gpt에게 물어본 바로는, 이 WMO 방식을 쓰게 되면 파일 간 인라인, 데드 코드 제거 등이 가능해지는데,,

불필요한 함수 호출을 없앤다던지 사용되지 않는 함수/변수를 포함한 코드가 컴파일 단계에서 제거된다고 합니다.

 

 

2. Dynamic Dispatch (동적 디스패치)

우선 먼저 정리하자면, Swift에서 클래스의 메서드와 프로퍼티는 기본적으로 동적 디스패치를 사용합니다. 즉, 실행 시간에 어떤 메서드가 호출될지 결정합니다.

Swift에서 클래스의 메서드는 기본적으로 vtable(가상 함수 테이블)을 사용해 동적 디스패치되는데, vtable은 각 클래스가 자신의 메서드 테이블을 가지고 있고, 객체의 타입에 따라 해당 테이블을 참조해 메서드를 호출하는 방식입니다. 즉, 동적 디스패치는 함수 호출 전에 vtable을 조회해야 하므로 일반적인 정적 디스패치보다 느립니다.

 

Dynamic Dispatch가 언제 필요한가?

- 클래스를 상속할 가능성이 있을 때

- 오버라이딩이 필요할 때 

- Objective-C와의 상호 운용성이 필요할 때 (@objc 사용 시 자동 적용됨)

 

이 Dynamic Dispatch를 피하기 위해선(성능 최적화를 위해선) final 키워드를 사용하도록 합니다. (다음 절에서 설명)

 

3. final 키워드

우선 final의 의미부터 말씀드리자면, "이 선언(클래스, 메서드, 프로퍼티)이 더 이상 상속되거나 오버라이드되지 않을 것"이라고 선언하는 것입니다.

 

클래스에 final을 사용하게 되면, 다른 클래스가 이 클래스를 상속받을 수 없게 됩니다. 다른 경우로 메서드나 프로퍼티에 final 사용 시, 해당 메서드나 프로퍼티는 하위 클래스에서 오버라이드할 수 없습니다.

결국 이 클래스가 다른 클래스에 의해 상속되지 않을 것이 확실할 때 혹은 이 메서드나 프로퍼티가 하위 클래스에서 오버라이드되면 안 될 때에 사용하게 됩니다.

 

앞에서 말했듯, final을 사용하면 클래스, 메서드 또는 프로퍼티 선언에 제한을 두어 오버라이드될 수 없게 합니다. 이는 컴파일러가 간접 호출 대신 직접 함수 호출을 생성할 수 있음을 의미하게 되는데,

 

직접 호출(Direct Call)이란?

컴파일러가 컴파일 시점에 함수나 메서드가 정확히 어디에 있는지 알고, 그 주소로 바로 점프하는 것을 말하고, 컴파일 시점에 호출할 함수의 주소가 결정되며 매우 빠르고 컴파일러는 인라인화와 같은 최적화를 적용할 수 있습니다.

 

간접 호출(Indirect Call)이란?

함수 호출 시 실제 함수 주소를 런타임에 결정합니다. 보통 포인터나 테이블(vtable)을 통해 간접적으로 함수를 호출하게 됩니다.

런타임에 어떤 함수를 호출할지 결정되고 직접 호출보다 느립니다. 다형성을 가능하게 하며 vtable이나 메시지 디스패치를 통해 구현됩니다.

 

결국, final 키워드를 사용하면 컴파일러에게 이 메서드는 오버라이드 되지 않을 것이다라고 알려주는 것이기에, 컴파일러는 간접 호출 대신 직접 호출을 사용할 수 있게 됩니다.

 

부가적으로 Swift에서 권장하는 방식은,

- 오버라이드가 필요없는 클래스와 메서드에는 final 사용하기

- 성능이 중요한 데이터 타입은 클래스 대신 구조체(struct) 사용 고려하기

- 프로파일링을 통해 실제로 성능에 영향을 미치는 부분 식별하기

 

라고 하네요 ! 근데 전 아직 잘 모르겠읍니다 허허,,

 

 

4. private / fileprivate 를 쓰면 좋은 이유

우선 private는 같은 클래스/구조체 안에서만 접근 가능하고 filePrivate는 같은 파일 안에서만 접근 가능하게 하는 접근 제한자입니다.

 

앞에서 말했듯 오버라이드의 가능성에 따라 ? 직 간접 호출의 유무가 어느정도 달리는 것 같은데,

 

이 두 키워드를 쓰게 되면 컴파일러가 "이건 오버라이드 될 일이 없겠다!"라고 판단해 가상 함수 호출(간접 호출을 말하는듯)을 제거하고 더 빠른 직접 호출로 최적화 해줍니다. 이는 결과적으로 실행 속도가 빨라지게 합니다.

 

다만 ! WMO (Whole Module Optimization)을 켜면 좋은게,, internal도 최적화가 가능하게 해줍니다.

WMO를 켜면 컴파일러가 모듈 전체를 한 번에 분석해서 "이것도 오버라이드될 가능성 없겠네!"하고 final처럼 최적화가 가능합니다.

그리고 가상 함수 호출 제거를 해 실행 속도가 최적화됩니다. (이 부분은 아직 습득은 안되는데 그렇다고 합니다...!)

internal은 기본값이라 따로 지정해주지 않아도 되기에 편해지는 것..!

 


private를 왜 써야하는지에 대한 고민으로 시작되어 튜터님께 여쭤보고 답을 들으며 해당 사이트를 공유해주셨는데, 마침 필요했던 부분이라 일부만 정리해봅니다,, 당장은 final을 쓸 고민부터 할 것 같네요 !

'iOS > Swift' 카테고리의 다른 글

[TIL / 25.03.20] 최적화(OptimizationTips) 2  (0) 2025.03.20
[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)  (2) 2025.03.19
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)  (0) 2025.03.17
[TIL / 25.03.13] 의존성 주입 (Dependency Injection)  (0) 2025.03.13
[TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결  (0) 2025.03.12
'iOS/Swift' 카테고리의 다른 글
  • [TIL / 25.03.20] 최적화(OptimizationTips) 2
  • [TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)
  • [TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)
  • [TIL / 25.03.13] 의존성 주입 (Dependency Injection)
subkyu-ios
subkyu-ios
subkyu-ios 님의 블로그 입니다.
  • subkyu-ios
    subkyu-ios 님의 블로그
    subkyu-ios
  • 전체
    오늘
    어제
    • 분류 전체보기 (56)
      • iOS (38)
        • Swift (38)
      • 내일배움캠프 (7)
      • Git, Github (3)
      • Algorithm (6)
      • 회고 (1)
      • 면접 질문 정리 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    algorithm
    til
    의존성 주입
    알고리즘
    TableView
    RxSwift
    stackview
    KPT
    프로그래머스
    Swift
    Wil
    본캠프
    tabman
    내일배움캠프
    사전캠프
    트러블슈팅
    UIKit
    github
    ios
    회고
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
subkyu-ios
[TIL / 25.03.18] 최적화(OptimizationTips) 1
상단으로

티스토리툴바