<객체지향의 사실과 오해, 조영호 지음 / 위키북스> 5장을 읽고 정리한 내용입니다.

자율적인 책임

자율적인 책임은 설계의 품질을 높인다.
자율적인 책임이란 객체가 스스로 판단하고 수행할 수 있도록 충분히 추상적이고 포괄적이면서 명확해야 한다.
단, 어떠한 책임이 자율적인지를 판단하려면 문맥이 고려되어야 한다.

적절한 책임이 자율적인 책임을 낳는다.
책임이 너무 추상적이라서 명확한 의도를 전달하지 못한다면 협력의 품질을 떨어뜨릘 수 있다.

따라서, 좋은 설계를 통해 협력의 질을 높이기 위해서는 각 객체에 자율적인 책임을 적절하게 배분하는 것이 중요하다.

자율적인 책임을 보장하기 위해서는 어떻게가 아닌, 무엇을 할지 설명해야 한다.
어떻게 해야 할지 설명하는 것은 객체의 자율성을 침해할 수 있기 때문이다.

그렇다면 객체가 책임을 수행하게 만들려면 어떻게 해야 할까?

메시지와 메서드

메시지는 객체의 행동을 유발하는 행위이다.
어떠한 객체가 다른 객체에 도움을 요청하는, 즉 책임을 수행하게 만들 수 있다.

메서드는 메시지를 수신받은 객체가 해당 메시지를 처리하기 위해 하는 행동이다.

메시지를 수신 받은 객체는 메시지를 처리하기 위해 메서드를 자율적으로 선택한다.
이때 객체가 내부에서 어떠한 메서드를 선택했는지 외부 객체는 알 수 없다.
이를 객체지향의 특성인 캡슐화 라고 한다.
또한, 메시지를 전송한 외부 객체는 어떤 타입의 객체가 해당 요청을 받게 될지도 알 수 없다. 즉, 수신 객체가 캡슐화된다.
이는 송신 객체와 수신 객체간의 결합도는 낮추고, 송신 객체와 메시지, 수신 객체와 메시지와의 결합도는 높인다.

이렇게 되면 수신 객체는 자유롭게 교체될 수 있고, 수신 객체가 요청을 처리하는 방식도 자유롭게 교체될 수 있다.
즉, 유연한 협력을 구성할 수 있어서 해당 협력을 확장하거나 재사용하기에 용이해진다 ✨

또한, 객체들이 동일한 메시지를 수신받더라도 각 객체마다 처리하는 내부 방식, 즉 메서드가 다를 수 있는데 이를 객체지향의 특성중 다형성이라 한다.
다형성이란 동일한 메시지를 수신 받은 객체들이 각자 내부 구현에 따라 자율적으로 선택하여 메시지를 처리할 수 있는 것이다.

메시지를 따라라

What/Who 사이클은 메시지를 먼저 결정하고, 해당 메시지를 처리할 객체를 선택하려는 관점이다.
메시지는 Tell, Don't Ask 라는 원칙에 따라 수신 객체에 많은 것을 묻지 않고, 그저 요청을 보내기만 하는 것이 바람직하다.

송신 객체는 수신 객체가 어떻게 동작하는지, 어떤 상태를 가졌는지 등의 내부 구현을 볼 수 없기 때문에 어떻게 처리할지가 아닌,
무엇을 처리해야 하는지 전달하면 된다.

이렇게 메시지를 통해 객체들은 자율적으로 협력에 참여한다.

객체 인터페이스

인터페이스란 객체들이 서로 상호작용할 수 있도록 이어주는 방법이나 장치 등을 말한다.
객체의 인터페이스는 해당 객체가 수신할 수 있는 메시지의 목록으로 구성된다.

먼저 메시지를 결정하고, 해당 메시지를 처리할 객체를 결정하기 때문에 메시지는 수신 객체의 인터페이스를 결정한다고 할 수 있다.

공용 인터페이스는 외부에 공개되어 접근 가능하므로 다른 객체에 협력을 요청하기 위해서는 수신 객체의 공용 인터페이스가 중요하다고 할 수 있다.

인터페이스와 구현의 분리

공용 인터페이스와 내부 구현은 분리되어야 한다.

객체가 외부 객체에 협력을 요청할 수 있는 유일한 방법은 메시지이고, 메시지를 처리할 객체가 결정하기 위해 공용 인터페이스를 참조한다.
즉, 공용 인터페이스는 객체의 외부를 뜻한다.

반면에 구현은 공용 인터페이스에 포함되지 않으면서 객체를 구성하는 모든 것을 포함한다.
메시지를 수신 받고 어떻게 처리할지는 내부 객체만 알아야 한다. 즉, 객체의 내부 구현은 캡슐화된다.
이를 통해 객체의 자율성을 보장할 수 있다.

따라서, 공용 인터페이스와 구현은 분리되어야할 필요가 있다.

이를 위해 인터페이스는 조금 더 추상적이어야 한다.
수신 객체가 구체적으로 어떠한 상태를 가지고, 어떠한 메서드를 실행할지 설명하지 않는다.

또한, 최소한의 인터페이스를 제공해야 한다.
외부 객체에 내부 객체에 대한 너무 많은 정보를 주지 않도록 최소한의 인터페이스를 작성하는 것이다.

책임의 자율성이 협력의 품질을 결정한다

자율적인 책임이란 외부 객체로부터 메시지를 수신 받았을때 해당 메시지가 요구 사항에 대해 명확하면서도 충분히 포괄적이고, 추상적인 것을 의미한다.

객체가 자율적인 책임을 가진 객체일수록 적절하게 추상화되고, 응집도는 높아지며, 다른 객체와의 결합도는 낮아진다.
동시에 객체 자신의 캡슐화는 증진된다. 또한, 인터페이스와 내부 구현이 명확하게 분리되므로 설계의 유연성과 재사용성을 보장할 수 있다.

📝

협력을 요청하는 송신 객체는 수신 객체에 대해 구체적으로 알지 못하고, 그저 메시지를 통해 요청만 한다는 개념이 새로웠다.
수신 객체와 송신 객체간의 결합도는 낮추고, 수신 객체와 메시지, 송신 객체와 메시지와의 결합도를 높이는 것이 결과적으로 객체의 자율성을 증진하고 유연한 설계를 구축할 수 있다는 점도 와닿았다.

앞으로 코드를 작성할때 외부 객체가 다른 객체의 내부 구현에 대해 너무 많은 것을 알고 있지는 않은지, 너무 구체적으로 도움을 요청하는 것이 아닌지 되돌아봐야겠다는 생각을 했다! ✨

댓글남기기