[swift] 동적 프로토콜 디스패치와 정적 프로토콜 디스패치

iOS 개발을 하다보면 프로토콜과 디스패치에 대해 들어본 적이 있을 것입니다. 이번에는 Swift에서의 동적 프로토콜 디스패치정적 프로토콜 디스패치에 대해 알아보겠습니다.

프로토콜 디스패치란 무엇인가요?

프로토콜 디스패치란 프로토콜을 통해 메소드를 호출하는 방법을 말합니다. Swift에서는 프로토콜 디스패치를 동적정적으로 나눌 수 있습니다.

동적 프로토콜 디스패치

동적 디스패치는 런타임 시간에 메소드를 호출할 대상을 결정하는 방식입니다. 이는 일반적으로 클래스 인스턴스를 통해 이루어집니다. 동적 디스패치는 일반적으로 Objective-C 런타임을 사용하는 Cocoa 프레임워크와의 상호 운용성을 위해 사용됩니다.

protocol Animal {
    func makeSound()
}

class Dog: Animal {
    func makeSound() {
        print("멍멍")
    }
}

let myPet: Animal = Dog()
myPet.makeSound() // 동적 디스패치

위의 예시에서 myPet.makeSound() 호출은 런타임 시간에 DogmakeSound() 메소드를 호출하는 동적 디스패치를 보여줍니다.

정적 프로토콜 디스패치

정적 디스패치는 컴파일 시간에 메소드를 호출할 대상을 결정하는 방식입니다. 이는 주로 구조체나 열거형을 통해 이루어집니다.

protocol Human {
    func speak()
}

struct Teacher: Human {
    func speak() {
        print("열공하세요!")
    }
}

let myTeacher: Human = Teacher()
myTeacher.speak() // 정적 디스패치

위의 예시에서 myTeacher.speak() 호출은 컴파일 시간에 Teacherspeak() 메소드를 호출하는 정적 디스패치를 보여줍니다.

결론

동적 프로토콜 디스패치와 정적 프로토콜 디스패치는 각각 런타임과 컴파일 시간에 메소드를 호출하는 방식을 말합니다. 프로토콜 디스패치의 이러한 차이는 Swift에서의 프로토콜 사용 시 유의해야 할 중요한 점 중 하나입니다.