지식조각모음
역할, 책임, 협력 본문
인간의 행동은 문맥(context)에 따라 결정된다. 객체지향의 세계에서도 그렇다. 객체들 간의 협력에 집중하라.
협력
협력은 도움을 요청하면서 시작된다. 도움을 주던 객체도 도움을 요청할 수 있다. 결국 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다. 각 객체는 요청에 대해 적절히 응답할 수 있다. 이 요청과 응답이 객체가 협력 안에서 해야할 책임을 정의한다.
책임
책임의 분류
p. 115
객체의 책임은 ‘객체가 무엇을 알고 있는가(knowing)’와 ‘무엇을 할 수 있는가(doing)’로 구성된다.
- 하는 것
- 객체를 생성하거나 계산하는 등의 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
- 아는 것
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
예를 들어 왕은 ‘재판을 수행하라’는 요청을 받았기 때문에 재판을 수행할 책임이 있다. 또한 책임을 수행하기 위해 하얀 토끼와 모자 장수에게 요청한다. 따라서 왕은 ‘다른 객체들의 활동을 제어하고 조율’하고 있으며 이에 대한 책임을 수행한다.

책임과 메시지
- 메시지 전송: 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것
책임을 언제 수행하는가? 다른 객체들에게 요청이 왔을 때 수행한다. 즉 메시지가 전송되었을 때 책임을 수행하며, 협력은 메시지를 통해 이뤄진다. 서로 다른 객체가 협력할 수 있는 이유는 이해할 수 있는 메시지를 전송하고, 메시지에 적절하게 응답할 수 있기 때문이다. 또한 책임을 수행한다는 것은, 요청을 수신할 수 있다는 사실을 암시한다.
다만 책임과 메시지의 수준이 같지 않다. 책임이 더 상위 수준이며 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다.
역할
어떤 책임을 수행한다는 것은 어떠한 역할을 수행한다는 뜻

위 그림과 달라진 것은 왕이 여왕으로 바뀌고 모자장수가 앨리스로 바뀌었다는 것 뿐이다. 그러면 두 그림을 다른 협력관계로 봐야할까? 서로 다른 협력이 있을 때 객체의 타입만 다를 뿐 책임이 동일하다면 이 협력은 서로 별도로 관리해야 할까?
아니다. 협력 과정 속에서 각 객체는 ‘역할(role)’을 가진다. 이 역할을 통해 협력을 하나로 추상화 할 수 있다. 역할은 다른 객체로 대체할 수 있음을 나타내는 표식이다. 동일한 요청을 받아 적절하게 응답할 수 있는 객체는 누구나 이 역할을 수행할 수 있게 된다.
동일한 역할 == 동일한 책임
협력의 추상화

왕, 여왕을 '판사'라는 역할로, 모자장수, 앨리스는 '증인'이라는 역할로 추상화 하였다. 이로써 모든 협력관계는 하나로 단순화 할 수 있게 되었다. 같은 역할을 할 수 있다면 판사의 자리에 어떤 객체가 와도 상관없다.
역할을 이용해 협력을 추상화하여 단순화 할 수 있다. 그러면 동일한 구조의 협력을 다양한 문맥에서 재사용할 수 있게 된다.
하지만 하나의 객체는 여러 역할을 가질 수 있다. 즉 하나의 객체가 가지는 책임이 하나 이상일 수 있다. 예를 들어 왕의 경우 판사의 책임과 왕의 책임을 가진다. 이런 경우 객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립한다. 역할은 일반화이며 객체 타입은 특수화다.
객체의 모양을 결정하는 협력
데이터나 클래스가 아닌 협력이라는 문맥을 고려해야 한다. 중요한 것은 책임이 아니다.
- 협력 설계하기
- 객체끼리의 요청과 응답의 흐름 결정 -> 책임
- 책임 즉 행동을 수행하기 위한 데이터 고려
- 클래스 구현 방법 결정
객체지향 설계 기법
- 책임-주도 설계
- 시스템의 기능은 더 작은 규모의 책임으로 분할되고, 각 책임은 책임을 수행할 적절한 객체에게 할당된다. 스스로 처리할 수 없는 경우 적절한 객체를 찾아 필요한 작업을 요청한다.
- 디자인 패턴
- 책임-주도 설계의 결과, 모범이 되는 설계
- 문제와 그 해법에 대한 정의
- 테스트-주도 개발
- 테스트보다 책임을 수행할 객체가 기대하는 객체의 역할, 어떤 메시지를 주고 받을 것인가, 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력하는가에 대한 기대를 작성하는 것
정리
- 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고 메시지를 수신하고 응답할 것인지를 결정하는 것에서 시작된다.
- 동일한 책임을 수행한다면 역할로 추상화 할 수 있다. 따라서 호환이 가능하고 이를 통해 협력을 추상화 할 수 있다.
'책 > 객체지향의 사실과 오해' 카테고리의 다른 글
| 객체 지도 (0) | 2023.09.06 |
|---|---|
| 책임과 메시지 (0) | 2023.08.31 |
| 타입과 추상화 (0) | 2023.08.14 |
| 이상한 나라의 객체 (0) | 2023.08.08 |
| 협력하는 객체들의 공동체 (0) | 2023.08.01 |