Youngminah / TIL

🌱 iOS 필수 숙지 개념 레포
281 stars 19 forks source link

Method Dispatch in Swift #104

Closed Youngminah closed 2 years ago

Youngminah commented 2 years ago

image

메모리에서 어떤 메커니즘으로 함수를 호출 하는지 알아보자





메소드 디스패치란?

메소드 디스패치: 메소드를 실행할 때 어떤 명령어을 실행해야 하는지 결정하도록 돕는 메커니즘 how a program selects which instructions to execute when invoking a method



글 시작전 알아야 할 것

Static Dispatch : 값 타입(value types) 과 참조 타입(reference types) 모두 지원한다. Dynamic Dispatch : 반면에, 동적디스패치는 참조 타입(reference types)만 지원한다. 이러한 이유는 동적디스패치를 위해서는 상속이 필요한데 값 타입은 상속을 지원하지 않기 때문이다.
크게 보면 , Dispatch 기술은 2가지 타입(Static and Dynamic)이 아닌 4가지 타입으로 나뉜다.

  1. Inline (Fastest)
  2. Static Dispatch
  3. Virtual Dispatch
  4. Dynamic Dispatch (Slowest)

이 중에 어떤 기술을 이용할 지는 컴파일러에 달려있다. 가장 빠른 Inline으로 올라가거나 가장 느린 Dynamic으로 내려오는 등 필요에 따라 결정한다.

Objective-C , Swift

Objective-C

디폴트로 Dynamic Dispatch를 지원한다.

Swift

Static vs. Dynamic

Dynamic

Static

위의 내용 직관적 정리

Static Dispatch (or Direct Dispatch)

Dynamic Dispatch

그렇다면, 비용이 많이 드는 Dynamic Dispatch 왜 사용할까? ❗️

image

Dynamic Dispatch 2가지 타입

Table Dispatch

Message Dispatch

예제

값타입

struct Person {
    func isIrritating() -> Bool { } // Static
}

extension Person {
    func canBeEasilyPissedOff() -> Bool { } // Static
}

프로토콜

protocol Animal {
    func isCute() -> Bool { } // Table
}

extension Animal {
    func canGetAngry() -> Bool { } // Static
}

클래스 (참조타입)

class Dog: Animal {
    func isCute() -> Bool { } // Table
    @objc dynamic func hoursSleep() -> Int { } // Message
}

extension Dog {
    func canBite() -> Bool { } // Static
    @objc func goWild() { } // Message
}

final class Employee {
    func canCode() -> Bool { } // Static
}

image




참고자료

Static vs Dynamic Dispatch in Swift: A decisive choice Method Dispatch in Swift 번역본

Lautner-kwangho commented 2 years ago

Static Dispatch : 갑 타입(value types) -> 오타 수정 Static Dispatch : 값 타입(value types)

Youngminah commented 2 years ago

Thank you ⭐️⭐️⭐️⭐️⭐️ @Lautner-kwangho