# 4장. 역할, 책임, 협력

객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은 채 객체가 가져야 할 상태와 행동부터 고민하기 시작한다는 것이다.

여기서 중요한 것은 개별 객체가 아니라 객체들 사이에 이뤄지는 협력이다.

### \[  책임  ]

크레이그 라만은 아래 분류 체계에 따라 객체의 책임을 크게 "하는 것" 과 "아는 것" 의 두 가지 범주로 분류하고 있다.

{% hint style="info" %}

#### 하는 것

* 객체를 생성하거나 계산을 하는 등의 스스로 행위를 수행
* 다른 객체의 행동을 시작시키는 것
* 다른 객체의 활동을 제어하고 조절하는 것
  {% endhint %}

{% hint style="info" %}

#### 아는 것

* 객체의 내부 속성 정보에 관해 아는 것
* 관련된 객체 정보에 대해 아는 것
* 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
  {% endhint %}

책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것)와 외부에 제공해 줄 수 있는 서비스(하는 것)의 목록이다.

한 가지 주의할 점은 책임과 메시지의 수준이 같지는 않다는 점이며, 책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이다.

협력을 정제하면서 이를 메시지로 변환할 때는 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다.

{% hint style="info" %}

#### **책에서 나온 스토리를 통한 예시 설명**

재판중인 곳에 앨리스가 들어섰다.

판사는 다름 아닌 한 나라의 "왕" 이었고, 판사가 첫번째 목격자를 호명한다.

첫번째 목격자인 "모자 장수"가 등장하였고, 왕은 모자 장수에게 증언하라고 명령했다.
{% endhint %}

<details>

<summary>정리</summary>

해당 챕터의 스토리에서 책임을 쉽게 알 수 있는 구간은 "모자 장수"인 목격자가 사건에 대한 증언을 하는 것이다.

목격자는 증언을 해야 하는 책임을 가지고 있고, 판사는 재판을 진행 시키고 목격자에게 증언을 명령하는 책임을 갖는 것이다.

그럼 이제 여기서, 위 책임을 통해 "아는 것"을 너무 많이 알게 되었을 때 어떻게 될지 살펴보자.

목격자인 "모자 장수"만 알고 있는 사건에 대한 진실을 말하지 않아도 판사가 알게되어 목격자 없이 재판을 속행할 수 있다. 이렇게 될 경우 왕은 모든 재판에서 단순 "데이터"만 가지고 그들의 변론을 듣지 않고 재판을 마무리 짓게 된다.

이러한 상황이 객체가 전지전능해지는 시점이라고 보며, 협력하지 못하는 객체는 나중에 목격자가 갖고 있는 데이터가 거짓일 수도 있기 때문에 심문을 해야한다는 요구사항이 생기면 왕은 스스로 모든 것을 해결 해왔기 때문에 객체의 행위를 변경하기 굉장히 까다롭게 되는 것이다.

</details>

### \[  역할  ]

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

> ***위 책임에서 나온 이야기 중 "왕"을 판사라고 부르고, "모자 장수"를 증인이라고 불러 상황을 복잡하게 만든 이유가 무엇일까?***

역할이 재사용 가능하고 유연한 객체지향 설계를 낳는 매우 중요한 구성요소이기 때문이다.

{% hint style="info" %}

#### **책에서 나온 스토리를 통한 예시 - 재판 과정에서 모자 장수가 퇴장하는 장면 부터**

"왕"은 "하얀 토끼"에게 다음 증인을 부르라고 명령했다.

다음 증인은 "공작 부인의 요리사" 였고 그가 법정에 들어서자 "왕" 은 다시 증언하라고 명령했다.

"요리사"는 왕의 명령을 어기고 싫다고 말 하고 사라졌다.

"왕"은 다음 증인을 부르라고 "하얀 토끼"에게 명령하였고, 다음 심문부터는 "여왕"에게 진행해달라고 부탁하였다.

"여왕"은 다음 증인에게 증언하라고 명령했다.
{% endhint %}

이 이야기에서 "왕과 여왕", "모자 장수와 요리사" 는 각자 인물만 다를 뿐 판사와 증인이라는 역할은 언제나 같다.

여기서 객체지향 관점에서 보면, 역할을 이용해 협력을 추상화했기 때문에 "판사"나 "증인"의 역할을 수행할 수 있는 어떤 객체라도 협력에 참여할 수 있게된다.

결국 동일한 역할을 수행할 수 있다는 것은 해당 객체들이 협력 내에서 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다.

즉, 역할의 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 **추상화**할 수 있고, 이로써 단순화된다.

객체가 역할을 대체하기 위해서는 행동이 호환돼야 한다는 점에 주목해야한다. 객체가 역할을 대체 가능하기 위해서는 협력 안에서 **역할이 수행하는 모든 책임을 동일하게 수행할 수 있어야 한다**.

<details>

<summary>정리</summary>

책임에서 나온 이야기를 보면, 판사의 역할은 "왕"이 될 수도 있고 "왕의 신하"가 될 수도 있고 역할을 수행하고 있는 인물은 다르더라도 판사라는 역할은 늘 똑같다.

이 역할은 인물이 바뀌더라도 책임을 따라야 할 의무가 있는 것이다.

</details>

### \[  객체의 모양을 결정하는 협력  ]

객체가 상태의 일부를 데이터로 포함하는 것은 사실이지만 데이터는 단지 객체가 행위를 수행하는 데 필요한 "재료"일 뿐이다.

객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다. 따라서 실제로 중요한 것은 객체의 행동, 즉 "책임"이다.

> 선입견

객체지향에서 데이터나 클래스를 중심으로 설계하는 이유는 위 언급되는 이야기의 "왕" 을 모델링할 경우, 대부분의 사람들은 왕관을 쓰고 멋진 수염을 기른 채 근엄한 표정으로 왕좌에 앉아있는 왕의 모습을 떠올린다.

그리고, 그렇게 떠올린 왕의 모습을 기반으로 클래스를 개발하기 시작한다.

이렇게 생성되는 데이터 기반 클래스는 추후 다른 객체와 협력할 때의 왕은 왕관, 수염, 근엄함 은 사실 어플리케이션에서 아무런 필요가 없다.

그저 "증언하라" 라고 명령하고 토끼에게 증인을 부르라고 명령하는 행위에 집중해야 할 뿐이다.

다시 설계 관점으로 살펴보면 실제로 동작하는 어플리케이션을 구축하기 위해서는 왕이 참여하는 "협력"을 우선적으로 고려해야 한다.

즉, 행동을 결정한 후에 행동을 수행하는 데 필요한 데이터를 고민해야 한다.
