본문 바로가기
객체지향

객체지향의 사실과 오해(4-1)

by browoo97 2022. 3. 24.

이번에는 이상한 나라의 앨리스에서 누가 파이를 훔쳤는 지에 대한 재판 이야기를 들어보자.

책임

왕은 재판을 진행하며 토끼는 증인을 부르고 모자 장수는 증언을 한다.

이 객체들은 하트 잭을 재판하기 위해 서로 협력하고 있다.

객체지향의 세계에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다.

 

책임과 메시지

왕, 토끼, 모자 장수는 각자가 맡은 의무가 있으며 각자가 맡은 의무를 다 하고, 그 과정에 남의 도움이 필요하다면 다른 이에게 요청하기도 한다. 이처럼 객체가 다른 객체에게 주언진 책임을 수행하도록 요청을 보내는 것을 메시지 전송이라고 한다. 따라서 두 객체 간의 협력은 메시지를 통해 이뤄진다. 책임이 협력이라는 문맥 속에서 요청을 수신하는 한 쪽의 객체 관점에서 무엇을 할 수 있는지를 나열하는 것이라면 메시지는 협력에 참여하는 두 객체 사이의 관계를 강조한 것이다.

 

역할

어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다. 이를 다르게 보면 협력 안에서 역할은 수행하든 책임을 다 한다면 어떤 객체가 그 역할을 수행하든 상관이 없다라고 볼 수 있다.

역할은 협력 내에서 다른 객체로 대체할 수 있음을 나타내는 일종의 표식이기도 하다. 협력 안에서 역할은 “이 자리는 해당 역할을 수행할 수 있는 어떤 객체라도 대신할 수 있습니다.”라고 말하는 것과 같다. 앞의 협력에서 ‘판사’라고 적혀 있는 자리는 하트왕과 하트 여왕이 대신할 수 있으며, ‘증인’이라고 적혀 있는 자리는 모자 장수, 요리사, 앨리스가 대신할 수 있다.

그렇다면 어떤 객체라도 ‘판사’나 ‘증인’의 역할을 대체할 수 있을까? 그렇지는 않다. 역할을 대체하기 위해서는 각 역할이 수신할 수 있는 메시지를 동일한 방식으로 이해해야 한다. ‘판사’의 역할을 하기 위해서는 ‘판사’가 수신할 수 있는 ‘재판하라’라는 메시지를 이해하고 처리할 수 있어야하고, ‘증인’의 역할을 하기 위해서는 ‘증인석에 입장하라’와 ‘증언하라’라는 메시지를 이해할 수 있어야 한다. 따라서 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정한다.

요약하면 역할의 개념을 사용하면 협력을 추상화해서 인지 과부하를 줄일 수 있으며 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀 더 유연해지며 재사용성이 높아진다. 역할은 객체지향 설계의 단순성, 유연성, 재사용성을 뒷받침하는 핵심 개념이다.

 

대체 가능성

역할은 협력 안에서 구체적인 객체로 대체될 수 있는 추상적인 협력자다. 따라서 본질적으로 역할은 다른 객체에 의해 대체 가능함을 의미한다. 객체가 역할에 주어진 책임 이외에 다른 책임을 수행할 수도 있다는 사실에 주목하라. 판사의 역할을 수행하는 왕은 재판을 할 책임뿐만 아니라 국정을 돌봐야 할 추가적인 책임을 가지고 있다. 따라서 대부분의 경우에 객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립하는 것이 일반적이다. 요약하면 역할의 대체 가능성은 행위 호환성을 의미하고, 행위 호환성은 동일한 책임의 수행을 의미한다.

 

흔한 오류

  1. 많은 사람들은 시스템에 필요한 데이터를 저장하기 위해 객체가 존재한다는 선입견을 가지고 있다. 객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다. 따라서 실제로 중요한 것은 객체의 행동, 즉 책임이다.
  2. 객체지향이 클래스와 클래스 간의 관계를 표현하는 시스템의 정척인 측면에 중점을 둔다. 중요한 것은 정적인 클래스가 아니라 협력에 참여하는 동적인 객체이며, 클래스는 단지 객체를 표현하고 생성하기 위한 구현 메커니즘이라는 사실이다.

댓글