객체지향의 사실과 오해/2 - 책임과 메세지

객체지향의 사실과 오해

객체지향의 사실과 오해를 읽고 정리한 내용입니다. 문제가 될 경우에는 삭제하겠습니다.

책임과 메세지

자율적인 책임

객체의 자율성

객체가 어떠한 행동을 하는 이유는 다른 객체로부터 메세지를 받았기 때문이다. 요청을 처리하기 위해서 객체가 수행하는 행동을 책임이라고 한다. 자율적인 객체는 스스로의 의지와 판단에 따라 각자 맡은 책임을 수행하는 객체를 의미한다.

하나의 객체가 다른 객체에게 요청을 보내면 요청을 받는 객체는 자신의 자율성에 따라서 요청을 처리하고 응답을 준다. 요청을 보낸 객체는 응답만을 받기 때문에 어떠한 방식으로 요청을 처리하는지에 관해서는 관심이 없다.

추상적인 요청

지나치게 정확한 요청은 응답을 하는 객체의 자율성을 침해한다. 요청을 받은 객체가 자신의 입맛에 맞게 요청을 처리할 수 있는데, 이를 요청하는 과정에서 제한을 두는 것이다. 그렇지만, 너무 추상적인 요청 또한 좋지 못하다. 너무 추상적인 요청은 협력의 의도를 표현하지 못하기 때문에 어떠한 응답을 주어야 하는지를 객체가 알지 못한다. 따라서 응답 또한 요청한 객체가 원했던 응답이 아닐 수도 있다.

‘어떻게’가 아니라 ‘무엇’을

자율적인 책임은 ‘어떻게’가 아니라 ‘무엇’을 해야 하는가를 설명한다는 것이다. ‘어떻게’를 설명하게되면 책임의 수준을 제한하기 때문에 자율성을 보장하면서 책임의 의도를 흐리지 않는 ‘무엇’을 기준으로 잡아야 한다.


메세지와 메소드

메세지와 메소드

하나의 객체는 메세지를 전송함으로써 다른객체에 접근한다. 메세지를 전송할 때 추가적인 정보가 필요한 경우에는 인자를 통해 주가정보를 제공할 수 있다. 이 때, 메세지를 전송받는 객체를 수신자, 전송하는 객체를 송신자라고 한다. 메세지 전송을 아래와 같은 방법으로 전송할 수 있다.

1
메세지(추가정보)

그렇지만 이러한 메세지만으로는 어떠한 수신자가 메세지를 수신하는지 알 수가 없다. 따라서 메세지를 받을 대상인 수신자의 정보를 추가해주어야 한다.

1
수신자.메세지(추가정보)

이렇게 전달된 메세지는 수신자의 행동을 결정한다. 이는 수신자에게 메세지를 처리할 책임이 있다는 말과 같다. 그리고 이러한 책임은 자율적으로 이루어져야 한다.

위에서 객체에게 메세지를 전달하기 위해 사용하는 방법을 메소드라고 한다. 수신자는 메세지를 받으면 해당 메세지를 처리할 수 있는지 확인하고 처리할 수 있다고 판단하면 처리할 수 있는 메소드를 선택한다.

다형성

다형성은 메세지를 수신하는 수신자가 자율적으로 메세지를 처리할 수 있는 방법이다. 송신자가 메세지를 통해 수신자에게 요청을 넣으면 수신자는 전달받은 메세지를 통해 메소드를 선택하는데, 이는 수신자가 누구냐에 따라 다르게 적용된다. 동일한 메세지를 보내도 수신자에 따라 다른 메소드로 처리를 하는 것이다.

또한 다형성은 기본적으로 동일한 역할을 수행할 수 있는 객체들 사이에서 대체 가능성을 가진다. 수신자들을 캡슐화 한다는 말이다. 송신자는 수신자가 누구인지 정확히 알 필요가 없이 메세지를 전송할 수 있고 수신자들은 메세지의 처리방식은 다르지만 송신자가 알고있는 방식으로 응답을 보낼 수 있다.

이런 다형성은 협력이 유연해지도록 해준다. 송신자는 수신자에 대한 어떠한 제약을 두지 않고 오직 메세지를 이해한다는 것만을 알고 보내기 때문에 수신자를 유연하게 대체할 수 있다. 그렇기 때문에 수행되는 방식을 바꾸기도 쉽다. 또한, 협력이 수행되는 방식을 재사용할 수 있다. 수신자를 유연하게 대체할 수 있기 때문에 다양한 문맥에서 협력을 재사용할 수 있다.