[TIL] Static Dispatch vs Dynamic Dispatch 차이

Eden·2025년 6월 26일

메서드 호출 방식에 대한 용어로 Static DispatchDynamic Dispatch
이 개념은 성능, 최적화, 그리고 실행 방식에 큰 영향을 주기 때문에 꼭 이해하고 있어야 합니다.


Static Dispatch (정적 디스패치)

  • 컴파일 시점에 호출 대상이 결정됨
  • 컴파일러가 함수 주소를 미리 알고 있기 때문에 빠르고 최적화가 쉬움
  • 값 타입 (struct, enum) 또는 final class, private 메서드에서 주로 사용됨

예시

struct Dog {
    func bark() {
        print("멍멍")
    }
}

let dog = Dog()
dog.bark() // 정적 디스패치

장점

  • 호출 속도가 빠름 (인라인 최적화 가능)
  • 오버헤드 없음

주의

  • 런타임에 메서드를 바꿀 수 없음 (유연성 낮음)

Dynamic Dispatch (동적 디스패치)

  • 런타임에 호출할 메서드를 결정
  • 주로 클래스에서 사용되며, 상속과 오버라이딩이 있는 경우에 필요함
  • Objective-C 런타임 기반 (@objc, dynamic 키워드 등)으로 작동할 수도 있음

예시

class Animal {
    func speak() {
        print("...")
    }
}

class Cat: Animal {
    override func speak() {
        print("야옹")
    }
}

let animal: Animal = Cat()
animal.speak() // 동적 디스패치

장점

  • 오버라이딩 가능 → 다형성(polymorphism) 지원
  • 런타임에서 메서드를 바꿀 수 있어 유연함

단점

  • 호출 시점에 테이블 탐색 비용 발생 → 성능 저하 가능

비교 정리

항목Static DispatchDynamic Dispatch
결정 시점컴파일 타임런타임
속도빠름느림
사용 대상struct, final class 등일반 class (상속, 오버라이딩)
다형성불가능가능
성능 최적화유리불리

결론

  • 특별한 이유가 없다면 Swift는 성능을 위해 static dispatch를 선호합니다.
  • 클래스 상속, 오버라이딩이 필요한 경우는 dynamic dispatch가 필요합니다.
  • 코드 설계 시 이 둘의 차이를 이해하고 선택적으로 사용하는 것이 중요합니다.
profile
iOS Dev

0개의 댓글