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

[정리] 객체지향의 사실과 오해 - 4장

따라쟁이개발자 2022. 12. 29. 10:00

04 / 역할, 책임, 협력

앨리스 왕국에 파이 훔친 범인을 찾기 위한 재판이 벌어진다.

판사 역할의 왕, 법정 안내자 역할의 토끼, 증인 역할의 모자장수.

 

각 인물들이 재판 과정에서 어떤 역할을 수행하고 협력하는지,

객체지향 세계에서 각 객체들은 또 어떤 협력을 이루고 있는지 설명한다.


협력

앨리스 왕국에 파이 훔친 범인을 찾기 위한 재판이 벌어진다

 

왕은 토끼에게 목격자를 불러올 것을 요청한다

왕의 요청을 받은 토끼는 응답으로 모자 장수에게 증인석에 입장할 것을 요청한다

토끼의 요청을 받은 모자장수는 응답으로 증인석에 입장한다

왕은 모자 장수에게 증언할 것을 요청한다.

왕의 요청을 받은 모자 장수는 응답으로 알고 있는 내용을 증언한다

 

재판 과정에서 많은 요청과 응답이 있었다.

재판에 대한 요청을 받은 왕은 재판을 진행할 의무가 있었고,

증인 입장 안내에 대한 요청을 받은 토끼자는 안내를 진행할 의무가 있었고,

증언 요청을 받은 모자 장수는 증언할 의무가 있었다.

 

각 인물이 요청을 받은 이유는 그 일을 해야 할 의무가 있었기 때문이다.

요청과 응답은 협력에 참여할 객체가 수행할 책임을 정의한다.

 

책임

객체의 책임은 

'객체가 무엇을 알고 있는가 (knowing)' '무엇을 할 수 있는가 (doing)'로 구성된다.

 

객체의 책임은 외부에서 접근 가능한 객체의 공용 서비스 관점에서 얘기할 수 있다.

책임은 객체의 공용 인터페이스(public interface)를 구성한다고 얘기할 수 있다.

  • 외부에 제공해 줄 수 있는 정보 (아는 것의 측면)
  • 외부에 제공해 줄 수 있는 서비스 (하는 것의 측면)

객체의 책임이 수행되는 시점은 다른 객체로부터 요청을 받았을 때이다.

모자장수가 토끼의 요청을 받고 증인석에 입장한 것처럼 말이다.

이처럼 객체가 다른 객체에게 책임을 수행하도록 요청하는 것을 메시지 전송이라고 한다.

 

객체지향 설계는 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고

어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것으로부터 시작된다.

 

역할

재판에서 왕은 '재판한다'는 책임을 지고 '판사' 역할을 수행한다

모자장수는 '증언한다', '증인석에 입장한다'는 책임을 지고 '증인' 역할을 수행한다

 

해당 객체가 가지는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다

굳이 책임을 묶어 역할로 만드는 이유는 역할이 재사용 가능하고

유연한 객체지향 설계를 낳는 매우 중요한 요소이기 때문이다

 

모자장수의 증언이 있은 후 공작부인의 증언이 이어진다.

재판 과정에서 머리가 아팠던 왕은 하트여왕에게 재판 역할을 위임한다.

이후 하트여왕은 '판사'의 역할로 재판을 이어나간다.

 

왕이 재판한 과정와 하트여왕이 재판한 과정은 크게 다르지 않았다

하트여왕 또한 토끼에게 증인 입장 시킬 것을 요청했고, 

증인으로 앨리스가 증인석에 앉았으며, 하트여왕은 앨리스에게 증언할 것을 요청했다.

 

역할(role)이라는 개념이 있었기에 

이전 재판과 방금 재판의 과정을 '재판' 이라는 하나의 협력으로 다룰 수 있었다.

동일한 메시지를 이해할 수 있다면 다른 객체여도 같은 '역할'로서 협력과정에서 대체될 수 있다.

즉, 역할의 대체 가능성은 행위 호환성을 의미하고 이는 동일한 책임의 수행을 의미한다.

 

역할의 개념을 사용하면 유사한

  • 협력을 추상화해서 인지 과부하를 줄일 수 잇으며 (단순성(simplicity))
  • 다양한 객체들이 협력에 참여할 수 있기 때문에 협력이 좀 더 유연해지고 (유연성(flexibility))
  • 다양한 객체들이 동일한 협력에 참여할 수 있기 때문에 재사용성이 높아진다. (재사용성(reusability))

 

객체의 모양을 결정하는 협력

어플리케이션을 설계할 때 흔하게 발생되는 오류들이 있다.

  • 객체를 시스템에 데이터 저장하기 위한 수단으로 보는 것
  • 객체지향 설계 시 클래스 간 관계를 표현하는 시스템 정적인 측면에 중점을 둔다는 것
  • 각 객체를 협력이라는 문맥 고려하지 않고 독립적으로 바라본다는 것

앨리스 왕국의 '왕'을 개발한다고 했을 때

많은 사람들은 협력 속 왕의 역할이 아닌 왕의 모습을 묘사하려고 하는 실수를 범했을 수 있다.

처음엔 생각했던 왕의 모습이 그대로 옮겨져있고 완벽히 동작하는 것처럼 보였을 수 있다.

 

하지만, 협력을 고려하지 않은 설계에서 왕이 '판사' 역할을 제대로 수행할 거라 확신하긴 어렵다.

우리가 설계할 때 고려해야 했던 것은 겉모습의 왕이 아닌 협력 내에서의 왕의 역할이다.

 

객체지향 설계 기법

어플리케이션을 역할, 책임, 협력 관점에서 설계할 때 유용한 세 가지 기법

  • 책임-주도 설계 (Responsibility-Driven Design)
  • 디자인 패턴 (Design Pattern)
  • 테스트-주도 개발 (Test-Driven Development)