동적 디스패치

업데이트:

동적 디스패치에 대해 설명하는 글입니다

동적 디스패치

Objective-C 런타임이 호출해야하는 특정 메소드나 함수의 구현을 런타임에 결정한다는 것

Objective-C에서 모든 메소드는 런타임시 메시지를 이용해서 다이나믹 디스패치 또는 동적 명령 전달 기법을 사용하는 반면, 스위프트에서 메소드는 명령 전달을 위한 다양한 기법을 제공합니다.

스위프트에서는 클래스 메소드에 @objc 속성 키워드 또는 dynamic 키워드를 추가하면 강제로 동적 디스패치가 적용됩니다. dynamic 키워드를 사용하면 @objc 속성 키워드가 암시적으로 표시됩니다.

Objective-C에서는 메소드를 메시지라는 개념으로 사용합니다. Objective-C의 명령 실행 체계인 메시지는 리시버, 셀렉터, 파라미터 등의 요소로 구성됩니다. 그 중 리시버는 메소드가 실행 결과를 받게 될 대상 객체이며, 파라미터는 메소드에 전달되어 실행될 객체를 의미합니다. 즉, 다음예제코드의 메시지의 리시버는 postalCode이고, length는 셀렉터, 파라미터는 없는 것입니다.

Objective-C 메시지로 모델을 전달할 때는 보통의 컴파일 시점의 바인딩이 아닌, 동적 바인딩 기법을 사용합니다. 이렇게 하면 메시지를 미리 구현해 놓지 않고, 런타임에 해당 메시지를 구현 및 실행하는 것이 가능해집니다. 런타임에서 특정 객체가 즉각 메시지에 반응할 수 없는 경우에도 상속 연쇄는 해당 객체를 찾을 때까지 기다렸다가 메시지를 전달합니다. 하지만 결국 해당 객체를 찾을 수 없을 때는 nil을 반환합니다.

위 내용을 쉽게 이해해보면 다음과 같습니다.

프로그램이 실행중일때 어떤 메소드를 실행해줘!라고 메시지를 보내면 메시지를 받은 객체가 메소드의 이름을 가지고 진짜 메소드가 구현되어 있는 곳으로 가서 메소드를 실행한다. 만약 메시지를 받은 객체가 메소드를 실행할 수 없는 경우에도 해당 객체를 찾을 때까지 기다렸다가 메시지를 전달하고 못찾으면 nil을 반환한다.

정적 디스패치

정적 디스패치는 런타임이 아닌 컴파일 타임에 메시지를 전달하는 것입니다. 이 방식은 메소드 전체를 직접 호출합니다. 런타임이 아닌 컴파일 타임에 메시지를 전달하기 때문에 동적 디스패치보다 빠릅니다.

출처

https://zeddios.tistory.com/296

댓글남기기