Books/객체지향의 사실과 오해

객체지향의 사실과 오해 - 책임과 메시지

devmomori 2022. 9. 7. 15:59

여러 내용들이 가리키는 하나의 목적은 소프트웨어의 유연한 변경, 즉 유지보수를 편하게 하는 것


자율성

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

객사오 142쪽 - 그림 5.1
모자 장수는 왕에게 증언할 책임은 있지만, 증언을 위한 구체적인 방법이나 절차에 대해서는 최대한의 자유를 누린다.

객사오 142쪽 - 그림 5.2
여기서 문제는 여러 책임들이 모자 장수가 증언하기 위해 선택할 수 있는 자유의 범위를 지나치게 제한한다는 점이다.


두 번째 모자 장수는 자율적으로 책임을 수행할 수 없다. 객체가 자율적이기 위해서는 객체에게 할당되는 책임의 수준 역시 자율적이어야 한다. 그러나 포괄적이고 추상적인 책임이 무조건 좋은 것은 아니다. 협력의 의도를 명확히 표현하는 것이 중요하다. 어떻게('How') 해야 하는 것보다 무엇('What')을 해야하는가가 중요하다.

메시지

메시지를 가리키는 '증언하라'라는 부분을 메시지 이름이라고 한다. 추가적인 정보가 필요한 경우에는 메시지의 인자(argument)를 통해 추가 정보를 제공할 수 있다. ex) 모자장수.증언(어제, 왕국)

1장부터 4장까지 계속해서 언급해온 메시지 송신자와 수신자에 대해서 설명한다. 요약하면 메시지는 객체들이 서로 협력하기 위해 사용되는 유일한 의사소통 수단이다.

메서드

모자 장수가 메시지를 처리하기 위해서 내부적으로 선택하는 방법을 메서드라고 한다. 해당 메시지를 처리할 수 있는지 확인 후, 주어진 책임을 다하기 위해 메서드를 선택한다. 메서드는 클래스 안에 포함된 함수 또는 프로시저를 통해 구현된다. 어떻게 수행되는지는 명시되지 않으며, '무엇'이 실행되기를 바라는지만 명시한다. 어떤 메서드를 선택할 것인지는 전적으로 수신자의 결정에 좌우된다.

유연하고 확장 가능하고 재사용성이 높은 협력의 의미

송신자가 수신자에 대해 매우 적은 정보만 알고 있더라도 상호 협력이 가능하다는 사실은 설계의 품질에 큰 영향을 미친다.

  1. 유연한 협력: 송신자는 수신자에대해 어떤 가정도 하지 않는다. 수신자를 다른 타입의 객체로 대체하더라도 송신자는 알지 못한다. 유연하게 협력이 변경 가능하다.
  2. 확장 가능성 : 협력이 동작하는 방식은 변경될지라도 협력의 구조 자체는 변경되지 않는다. ex) 증언을 할 때 재판장에 참석하는 것이 아닌 동영상만 보낼 수 있는 객체
  3. 재사용성 : 재판이라는 협력을 누구에게나 적용할 수 있다.

메시지를 기반으로 한 두 객체 사이의 낮은 결합도가 설계를 유연하게 하고 확장 가능하며 재사용 가능하게 만든다.


인터페이스

특징

  • 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사 전달이 가능하다.
  • 인터페이스의 변경 없이 단순히 내부 구성이나 작동 방식을 변경하는 것은 사용자에게 어떤 영향도 미치지 않는다.
  • 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제 없이 상호작용 할 수 있다.


메시지가 인터페이스를 결정한다. 객체가 어떤 메시지를 수신할 수 있는지가 객체가 제공하는 인터페이스의 모양을 빚는다.

인터페이스와 구현의 분리

  • 좀 더 추상적인 인터페이스
  • 최소 인터페이스
  • 인터페이스와 구현 간에 차이가 있다는 점을 인식
1. 상세한 수준의 메시지가 아닌 위에서 설명한 '증언하라'처럼 추상적인 수준의 메시지를 통해 수신자의 자율성을 보장한다.
2. 외부에서 사용할 필요가 없는 인터페이스는 최대한 노출하지 않는다. 이를 통해 내부를 수정하더라도 외부에 미치는 영향을 최소화한다.
3. 객체의 외부와 내부를 분리하는 것은 결국 객체의 공용 인터페이스와 구현을 명확하게 분리하라는 말과 동일하다.

인터페이스와 구현의 분리 원칙이 중요한 이유?

소프트웨어는 항상 변경되기 때문이다. 어떤 객체를 수정했을 때 발생하는 사이드 이펙트를 예상하는 것은 어렵다. 객체가 가져야 할 상태와 메서드 구현은 객체 내부에 속한다. 이 부분을 수정하더라도 객체 외부에 영향을 미쳐서는 안 된다. 객체 외부에 영향을 미치는 변경을 객체의 공용 인터페이스를 수정할 때뿐이다.


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

책임의 적절한 추상화를 통한 협력의 단순화. 자율적인 책임은 협력을 단순하게 만든다.

자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다. 왕은 증언하라 명령했지만 모자 장수가 내부적으로 어떻게 책임을 수행하는지는 볼 수 없다. 요청하는 객체가 몰라도 되는 사적인 부분이 객체 내부로 캡슐화된다. 인터페이스와 구현이 분리된다.

수행하는 내부적인 방법을 변경해도 외부에 영향을 미치지 않는다. 증언하는 방법은 변경해도 왕에게는 어떤 영향도 미치지 않는다. 그러나 자율적인 책임을 가질 수 없었던 세세한 증언 방법의 요청(시간 순서로, 목격 장면, 간결한 표현 등)은 하나라도 변경되게 된다면 협력이 무너지게 된다. 책임이 자율적일수록 변경에 의해 수정되어야 하는 범위가 좁아지고 명확해진다. 변경의 파급효과가 객체 내부로 캡슐화되기 때문에 두 객체간의 결합도가 낮아진다.

자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다. 모자 장수 이외에 앨리스나, 요리사가 증언을 하는 예시가 있다. 설계가 유연해지고 재사용성이 높아진다.

객체의 역할을 이해하기 쉬워진다. '증인석 입장', '증언하다'라는 두 가지 책임을 가진 모자장수가 어떤 역할을 해야 하는지 명확히 알려준다. 객체의 응집도를 높은 상태로 유지하기가 쉬워진다.

책임이 자율적일수록
적절하게 '추상화'되고,
'응집도'가 높아지고,
'결합도'가 낮아지며,
'캡슐화'가 증진되고,
'인터페이스와 구현이 명확히 분리'되고,
'설계의 유연성과 재사용성이 향상'된다.