5장. 책임과 메시지
의도는 "메시징"이다. 훌륭하고 성장 가능한 시스템을 만들기 위한 핵심은 모듈 내부의 속성과 행동이 어떤가보다는 모듈이 어떻게 커뮤니케이션하는가에 달려있다.
- 앨런 케이
사건에 대한 목격자가 많으면 많을수록 개인이 느끼는 책임감은 적어진다. '책임감 분산(diffusion of responsibility)' 현상으로 군중들 사이로 타인을 도와야 한다는 책임이 분산되어 흩어질 경우 사람들은 애써 자신의 책임을 무시하려고 한다.
이와 달리 자기 혼자 목격한 경우 자신에게 타인을 도와야 하는 책임이 있다고 생각한다.
객체의 세계는 이처럼 명확한 책임과 역할을 지닌 참가자들이 협력에 참여해야 한다는 교훈을 얻을 수 있다. 훌륭한 객체지향의 세계는 명확하게 정의된 역할과 책임을 지닌 객체들이 상호 협력하는 세계다.
역할과 책임이 흐려질수록 도움이 필요한 객체를 도와줄 어떤 협력 객체도 찾지 못하게 된다.
자율적인 책임
객체지향 공통체를 구성하는 기본 단위는 '자율적인 객체'다. 애플리케이션 기능을 구현하기 위해 협력하고, 협력 과정에서 각자의 책임을 다하기 위해 '자율적'으로 판단하고 행동한다.
자율적인 객체
자율성: 자기 스스로의 원칙에 따라 어떤 일을 하거나 자신을 통제해서 절제하는 성질이나 특성
타인의 명령이나 규칙에 따라 판단하고 행동하는 객체는 자율적인 객체라고 부르기 어렵다.
객체지향 설계의 아름다움은 적절한 책임을 적절한 객체에게 할당하는 과정 속에서 드러난다.
적절한 책임은 자율적인 객체를 낳음
자율적인 객체들이 모여 유연하고 단순한 협력을 낳음
따라서 협력에 참여하는 객체가 얼마나 자율적인지에 따라 전체 애플리케이션의 품질을 결정한다.
앨리스의 재판 이야기로 예시를 들어보자.
왕이 모자 장수에게 '증언하라' 라는 요청(메시지)를 보낸 상황
모자 장수가 자율적인 객체인 경우, 어떤 방법으로 증언하는지에는 관심이 없다.
증언 방식이나 증언에 필요한 자료는 스스로의 의지와 판단에 따라 자유롭게 선택이 가능한 것
모자 장수가 자율적이지 못한 객체의 경우, 상세한 수준으로 요청해야 한다.
1. 목격했던 장면을 떠올려라 / 2. 떠오르는 시간 순서대로 재구성하라 / 3. 말로 간결하게 표현하라
증언 방식이나 증언을 어떻게 해야하는지까지 간섭을 하게 된다.
모자 장수가 증언하기 위해 선택할 수 있는 자유의 범위를 지나치게 제한하게 된다.
자신의 책임을 수행하기 위해 자신의 의지나 판단력이 아닌 외부 명령에 의존하는 객체는 충분히 자율적이지 못하다.
너무 추상적인 책임
그렇다고, 포괄적이고 추상적인 책임을 선택한다고 무조건 좋은 것은 아니다. 협력의 의도를 명확하게 표현하지 못할 정도로 추상적인 것 역시 문제이다.
만약 위에서 왕이 '증언하라' 라는 요청이 아닌 '설명하라' 라고 했다면 모자 장수는 어떤 설명을 해야하는가?
추상적이고 포괄적인 책임은 더 다양한 환경에서 재사용할 수 있도록 유연성을 제공하지만, 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.
자율적인 책임은 어떻게(how)가 아닌 무엇을(what) 해야하는가 설명한다. 어떻게 응답할 것인지는 객체의 자율성에 맡기는 것임을 명심하자.
메시지와 메서드
메시지
객체는 메시지를 전송함으로써 다른 객체에 접근
메시지-전송 메커니즘은 객체가 다른 객체에 접근할 수 있는 유일한 방법
메시지 송신자와 수신자 사이의 협력이 이루어짐
메시지의 구조는 다음과 같다.
메시지 이름(Message Name): '증언하라'
메시지 인자(Message Argument): 메시지 전송시 추가적인 정보
메시지 전송은 수신자 + 메시지 조합
메시지를 수신받은 객체는 해당 메시지를 처리할 수 있는지 확인
메시지를 처리할수 있다 = 해당 메시지에 대한 행동을 수행해야 할 책임이 있다.
메시지의 모양이 객체가 수행할 책임의 모양을 결정
메시지 수신자는 이를 처리하는 방법을 자유롭게 선택할 수 있다. 송신자는 메시지를 제외한 어떤 것도 볼 수 없기 때문이다.
메시지는 객체들이 협력하기 위해 사용하는 유일한 의사소통 수단
객체가 메시지를 수신할수 있다는 것은 해당하는 책임을 수행할 수 있다는 것
메시지 수신자가 어떻게 처리하는지는 자율적으로 선택이 가능하며 송신자는 알 수 없다.
이러한 책임을 기반으로 객체지향 세계가 이루어져야 하는 것을 강조하는 것으로 보인다.
메서드
메시지를 수신한 객체가 내부적으로 메시지를 처리하기 위해 선택하는 방법을 메서드라고 한다.
객체는 메시지를 수신하면 해당 메시지를 처리할 수 있는지 확인
처리가 가능하다면, 주어진 책임을 다하기 위해 메시지를 처리할 방법인 메시드를 선택
객체지향 프로그래밍 언어에서 메서드는 클래스 안에 포함된 함수/프로시저를 통해 구현된다. 따라서 어떤 객체에게 메시지를 전송하면 결과적으로 메시지에 대응되는 특정 메서드가 실행된다.
중요한 점은 '어떻게(how)' 수행될 것인지는 메시지에 담겨져 있지 않다. 오직 '무엇(what)'이 실행되기를 바라는지만 명시된다는 점이다.
다형성
서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘을 가리킨다.
모자 장수가 아닌 다른 객체들도 왕이 전송한 '증언하라'라는 메시지를 처리할 수 있다. 또한, 각 수신자는 자신만의 방법을 선택할 수 있다.
다형성은 역할, 책임, 협력과 깊은 관련이 있다.
각각 다른 객체들이 다형성을 만족한다는 것은 객체들이 동일한 책임을 공유한다는 것
즉, 송신자 관점에서 다형적인 수신자들을 구별할 필요 없이 요청을 수행할 수신자들이 책임을 지님
수신자의 종류를 캡슐화하여 객체들의 대체 가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다. 객체지향 패러다임이 강력한 이유는 다형성을 이용해 협력을 유연하게 만들 수 있기 때문이라는 점을 기억하자.
유연하고 확장 가능하고 재사용성이 높은 협력을 구성하자. 메시지를 기반으로 두 객체 사이의 낮은 결합도가 바로 설계가 핵심인 것이다. 따라서, 설계의 품질을 높이기 위해서는 훌륭한 메시지를 선택해야 한다.
Last updated
Was this helpful?