![[오브젝트] 3장 - 역할, 책임, 협력 관련 이미지 1](/images/13-img.png)
내용 정리: 20240311 TIL
1. 개요
3장은 역할, 책임, 협력에 초점을 맞춰 설명한다.
이전 장에서는 객체지향 프로그래밍의 다양한 기법들을 살펴봤지만, 이번 장에서는 그 기법을 넘어선 설계의 본질적인 요소에 대해 살펴본다.
아무리 효과적인 기법을 사용했다 하더라도 역할과 책임, 협력이 적절하지 못하다면 설계는 망가지게 된다.
2. 협력
**협력(collaboration)**은 객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 의미한다.
객체들은 협력을 통해 메시지를 주고받으며, 메시지를 수신한 객체는 적절한 메서드를 실행하여 요청에 응답한다.
설계 관점에서 협력은 **문맥(context)**을 결정하는 중요한 요소다.
객체의 상태는 그 객체가 행동하는 데 필요한 정보에 의해 결정된다.
이 행동은 협력 내에서 객체가 처리할 메시지로 결정된다.
따라서 협력을 정의하는 과정은 각 객체의 행동과 상태를 어떻게 구성해야 할지에 대한 문맥을 제공한다.
3. 책임
책임이란?
**책임(responsibility)**은 협력에 참여하기 위해 객체가 수행하는 행동이다.
협력 내에서 객체가 유지해야 할 정보와 수행할 수 있는 행동을 개략적으로 설명한 것이 책임이다.
책임은 메시지보다 추상적인 개념이다.
처음에는 단순해 보이던 책임이 여러 메시지로 세분화될 수 있다.
또한 하나의 객체가 수행할 수 있다고 생각했던 책임이 여러 객체들이 협력해야 하는 큰 책임이 되기도 한다.
책임의 분류
책임은 크게 두 가지 유형로 나뉜다: '무엇을 할 수 있는가(doing)'와 '무엇을 알고 있는가(knowing)'.
책임의 관점에서 두 유형은 밀접하게 연결되어 있다.
객체는 자신이 맡은 책임을 수행하는 데 필요한 정보를 알고 있을 책임이 있다.
또한 객체는 자신이 할 수 없는 작업을 도와줄 객체를 알고 있을 책임이 있다.
객체에게 책임을 주기 위해서는 어떤 행동을 해야 하고 그 행동을 위해 무엇을 알아야 하는지 결정하면 된다.
책임 할당
적절한 책임을 적절한 객체에 할당해야 단순하고 유연한 설계가 가능하다.
가장 간단한 방법은 필요한 정보를 가장 잘 알고 있는 정보 전문가(Information Expert) 객체에게 책임을 할당하는 것이다.
응집도와 결합도 관점에서 정보 전문가가 아닌 다른 객체에게 책임을 할당하는 경우도 있다.
하지만 기본적으로 책임을 수행할 정보 전문가를 찾는 것이 좋다.
책임 주도 설계
**책임 주도 설계(Responsibility-Driven Design, RDD)**는 책임을 찾고 책임을 수행할 객체를 찾아 책임을 할당하는 방식으로 협력을 설계한다.
책임 주도 설계 과정은 다음과 같다:
- 시스템이 사용자에게 제공해야 하는 기능을 파악한다. (시스템 책임)
- 시스템 책임을 더 작은 책임으로 분할한다. (책임 분할)
- 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다. (책임 할당)
- 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요할 경우 이를 책임질 적절한 객체 또는 역할을 찾는다. (적절한 책임자 찾기)
- 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다. (협력을 위한 책임 할당)
책임 주도 설계에서 볼 수 있듯 객체의 상태가 아닌 행동에 집중해야 한다.
상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일 뿐이다.
협력이 객체의 행동을 결정하고, 행동은 상태를 결정한다.
그 행동이 바로 객체의 책임이다.
4. 역할
역할이란?
**역할(role)**은 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 의미한다.
협력을 설계할 때는 구체적인 객체가 아닌 역할에게 책임을 할당한다고 생각하자.
역할은 객체를 한 단계 더 추상화한 것이다.
이를 통해 다양한 종류의 객체가 동일한 역할을 수행할 수 있도록 한다.
역할을 구현하는 일반적인 방법은 추상 클래스와 인터페이스를 사용하는 것이다.
두 방법은 다양한 종류의 클래스들을 협력에 참여시킬 수 있는 확장 포인트가 된다.
객체와 역할의 구분
한 종류의 객체만이 협력에 참여하는 경우까지 역할로 추상화할 필요는 없다.
과도한 추상화는 오히려 설계의 복잡성을 증가시킬 수 있다.
따라서 협력에 적합한 책임을 수행하는 대상이 한 종류면 객체, 여러 종류면 역할이라고 부르는 것이 좋다.
역할과 객체를 직관적으로 구분하는 것은 어렵다.
처음에는 모든 것을 객체로 보고 책임과 협력을 정제해 가며 필요한 순간에 역할을 분리하자.
5. 느낀 점
객체지향에서 강조하는 역할, 책임, 협력에 대해서 구체적으로 이해할 수 있었다.
협력은 설계의 흐름을 알게 해 준다.
책임은 협력 안에서 객체가 수행해야 할 행동이다.
역할은 공통된 책임을 추상화한 것이다.
다형성, 상속, 캡슐화와 같은 기법에만 집중했을 때는 그 목적이 와닿지 않았다.
하지만 넓은 관점에서 바라보니 이 기법들은 역할, 책임, 협력을 실현하기 위한 도구임을 알게 되었다.
좋은 객체지향 설계를 위해 집중해야 할 것은 단순한 기법의 적용이 아니다.
역할과 책임을 중심으로 하여 협력을 구축해야 객체지향이 원하는 설계를 할 수 있을 것이다.
