객체지향의 사실과 오해(5-1)
자율적인 책임
객체가 책임을 자율적으로 수행하기 위해서는 객체에게 할당되는 책임 또한 자율적이여야 한다.
만약 왕이 모자 장수에게 ‘목격했던 장면을 떠올리고’, ‘떠오르는 기억을 시간 순서대로 재구성’한 후, ‘말로 간결하게 표현’해야라는 증언 요청을 보낸다면 모자장수 증언하라는 최종 목표는 만족시키지 몰라도 모자 장수가 누려야 하는 선택의 자유를 크게 훼손시키고 만다. 결국 모자 장수는 책임을 수행하기 위해 자신의 의지나 판단력이 아닌 왕의 명령에 의존할 수밖에 없게 된다.
객체지향 세계는 자율적인 객체들의 공동체라는 점을 명심해라. 객채가 자율적이기 위해서는 객체에게 할당되는 책임의 수준 역시 자율적이어야 한다. 이는 전체 애플리케이션의 품질을 결정한다.
너무 추상적인 책임
하지만 포괄적이고 추상적인 책임을 선택한다고 해서 무조건 좋은 것은 아니다. 예를 들어 왕이 모자 장수에게 ‘증언하라’라는 요청이 아닌 ‘설명하라’라는 요청을 하게 된다면 어떻게 될까? 그럼 모자장수는 무엇을 설명해야 하는가? 추상적이고 포괄적인 책임은 협력의 재사용성과 유연성을 주지만 책임은 협력에 참여하는 의도를 명확하게 설명할 수 있는 수준 안에서 추상적이어야 한다.
어떤 책임이 자율적인지를 판단하는 기준은 문맥에 따라 다르다는 사실을 유의하라. 비록 재판이라는 협력 안에서는 ‘증언하라’라는 책임이 가장 적절한 수준의 책임이지만 다른 상황에서는 ‘설명하라’라는 책임이 자율권을 보장하는 최선의 선택이 될 수 있다. 이런 모호함이 객체지향 설계를 난해하면서도 매력적인 예술로 만드는 이유이다.
메시지와 메서드
하나의 객체는 메시지를 전송함으로써 다른 객체에 접근한다. 메시지는 메시지 이름과 인자의 두 부분으로 구성된다. 왕이 어제, 왕국에서 목격한 것을 증언할 것을 요청하고 싶을 때 다음과 같은 메시지를 이용할 것이다.
증언하라(어제,왕국)
메시지 전송은 수신자와 메시지의 조합이며 여기서 메시지는 메시지 이름과 인자의 조합이므로 결국 메시지 전송은 수신자, 메시지 이름, 인자이 조합이 된다. 즉, 메세지 전송은 다음과 같을 것이다.
모자장수.증언하라(어제,왕국)
메시지는 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 의사소통 수단이며 요청 받은 객체는 메시지를 처리하기 위한 방법을 자율적으로 선택할 수 있다.
메시지를 처리하기 위해 내부적으로 선택하는 방법을 "메서드"라고 한다.
모장 장수의 예에서 왕이 전송한 ‘증언하라’라는 메시지를 처리하기 위해 모자 장수가 내부적으로 선택하는 증언 방법이 바로 메서드에 해당된다. 메시지는 요청을 ‘어떻게’ 수행할 것인지는 명시하지 않으며, 단지 오퍼레이션을 통해 ‘무엇’이 수행되는 지만 명시한다. 어떤 메서드를 선택할 것인지는 전적으로 수신자의 결정에 좌우된다.
다형성
메시지와 메서드의 차이와 관계를 이해하고 나면 객체지향의 핵심인 다형성을 쉽게 이해할 수 있다.
다형성이란 서로 다른 타입에 속하는 객체들이 동일한 메시지를 수신할 경우 서로 다른 메서드를 이용해 메시지를 처리할 수 있는 메커니즘이다. 따라서 다형성을 하나의 메시지와 하나 이상의 메서드 사이의 관계로 볼 수 있다.
다형성은 메시지 송신자의 관점에서 동일한 역할 수행하는 다양한 타입의 객체와 협력할 수 있게 한다. 이것은 동일한 역할을 수행할 수 있는 객체들 상의 대체 가능성을 의미하는 것이기도 한다.
예를 들어 모자 장수, 요리사, 앨리스는 협력 안에서 서로 대체 가능한 존재이다. 비록 메시지를 처리하는 방법인 메서드가 다르더라도 말이다.
다형성은 객체들의 대체 가능성을 이용해 설계를 유연하고 재사용 가능하게 만든다. 다시 한번 강조하자면 객체지향 패러다임이 강력한 이유는 다형성을 이용해 협력을 유연하게 만들 수 있기 때문이라는 점을 기억하자.
송신자와 수신자를 약하게 연결하는 메시지
얼핏 보기에는 모든 것이 다형성의 축복처럼 느껴지지만 이 모든 것은 다형성을 지탱하는 메시지가 존재하기 때문에 가능한 것이다. 메시지는 송신자와 수신자 사이의 결합도를 낮춤으로써 설계를 유연하고, 확장가능하고, 재사용 가능하게 만든다. 따라서 설계의 품질을 높이기 위해서는 훌륭한 메시지를 선택해야 한다.