메시지 전달은 한 객체가 다른 객체 (또는 잠재적으로 자체)가 무언가를 수행하도록 OO 코드의 요구를 처리하는 다른 방법입니다.
C ++ 방식에서 유래 한 대부분의 현대 언어에서는 메소드 호출을 사용하여이를 수행합니다. 이 경우, 호출 된 객체 (클래스 정의를 통해)는 어떤 메소드 호출을 받아들이는지에 대한 큰 목록을 작성한 다음 호출 객체의 코더가 단순히 호출을 작성합니다.
public void doSomething ( String input )
...
other_object.dosomething ( local )
정적으로 유형이 지정된 언어의 경우 컴파일러는 호출되는 항목의 유형을 확인하고 메소드가 선언되었는지 확인할 수 있습니다. 동적으로 입력 된 언어의 경우 런타임에 수행됩니다.
그러나 본질적으로 발생하는 일은 변수 묶음이 특정 코드 블록으로 전송된다는 것입니다.
메시지 전달
메소드 대신 메시지 전달 언어 (예 : Objective C)에는 수신자가 있지만,이를 정의하고 호출하는 방식은 거의 동일합니다. 차이점은 처리 방식입니다.
메시지 전달 언어에서 컴파일러 는 사용자가 호출 한 수신자가 존재하는지 확인할 수 있지만 최악의 경우 해당 수신자가 확실하지 않다는 경고가 표시됩니다. 이는 런타임에 수신 객체의 코드 블록이 변수 묶음과 호출하려는 수신자의 서명을 모두 전달하여 호출되기 때문입니다. 그런 다음 해당 코드 블록은 수신자를 찾아서 호출합니다. 그러나 수신자가 존재하지 않으면 코드는 단순히 기본값을 반환합니다.
결과적으로 C ++ / Java-> Objective C에서 이동할 때 발견되는 이상한 점 중 하나는 컴파일 타임 유형에 선언되지 않았고 존재하지 않는 객체에서 "메소드를 호출 할 수 있음"을 이해하는 것입니다. 런타임 유형 ... 및 호출로 인해 예외가 발생하지 않지만 실제로 결과가 전달됩니다.
이 접근법의 장점은 서브 클래스 계층 구조를 평평하게하고 인터페이스 / 다중 상속 / 오리 유형에 대한 대부분의 요구를 피한다는 것입니다. 또한 객체가 수신자가없는 무언가를하도록 요청 받았을 때 객체가 기본 동작을 정의 할 수있게합니다 (일반적으로 "내가하지 않으면 요청을이 다른 객체로 전달"). 또한 Java와 같이 정적으로 유형이 지정된 언어를 통해 특히 콜백 (예 : UI 요소 및 시간 초과 이벤트)에 대한 링크를 단순화 할 수 있습니다 (따라서 내부 클래스에서 "actionPerformed"메소드를 호출하는 대신 버튼을 사용하여 수신자 "runTest"를 호출 할 수 있음) "RunTestButtonListener").
그러나 개발자가 생각하는 호출이 올바른 유형의 올바른 객체에 있고 올바른 매개 변수를 올바른 순서로 전달한다는 것은 개발자의 추가 검사가 필요한 것으로 보입니다. 컴파일러는 경고하면 런타임에 완벽하게 실행됩니다 (기본 응답 만 반환). 추가 조회 및 매개 변수 전달로 인한 성능 저하도있을 수 있습니다.
요즘에는 동적으로 유형이 지정된 언어가 OO로 전달 된 메시지의 문제점을 줄이면서 많은 이점을 얻을 수 있습니다.