[oop Series] 04.role_responsibility_collaboration
March 30, 2025
역, 책임, 협력
- 객체지향의 본질은
- 객체들의 공동체를 창조하는 것
- 협력을 구성하기 위해서 적절한 객체를 찾고 그 객체에 적절한 책임을 할당하는 것
- 어떤 협력이 필요하고 협력을 위해 어떤 역할과 책임이 필요한지를 고민하는 것
협력
- 객체 지향 시스템은 자율적인 객체들의 공동체다.
- 객체는 고립된 존재가 아니라 시스템의 기능이라는 더 큰 목표를 달성하기 위해 다른 객체와 협력하는 사회적인 존재다.
- 협력은 객체지향의 세계에서 기능을 구현할 수 있는 유일한 방법이다.
- 메시지 전송으로 객체 사이의 협력을 위해서 사용할 수 있는 유일한 커뮤니케이션 수단이다.
- 메시지를 수신한 객체는 메소드를 실행해서 요청에 응답한다.
- 즉, 메시지 처리할 방법을 스스로 선택한다.
- 결과적으로 객체는 자율성을 가져야한다. 자율성을 가질 수 있는 방법은 내부 구현을 캡슐화하는 것이다.
- 객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다. 협력이 바뀌면 제공해야 하는 행동도 바뀌어야 한다.
- 협력이 객체를 구성하는 행동과 상태 모두 결정한다. 따라서 협력은 객체를 설계하는 데 필요한 일종의 문맥이다.
책임
- 협력이 정해졌다면 적절한 객체를 찾아야 한다. 이때 협력에 참여하기 위해서 객체가 수행하는 행동을 책임이라고 한다.
- 책임은 객체에 의해 정의되는 응집도 있는 행위의 집합으로, 객체가 유지해야 하는 정보와 수행할 수 있는 행동에 대해 개력적으로 서술한 문장이다.
- 자율적인 객체를 만들면서 책임을 수행하려면 필요한 정보를 가장 잘 아는 전문가에 책임을 할당하는 것이다.
- 물론 책임 할당 과정에서 응집도, 결합도를 고려해서 다른 객체에 책임을 할당하는 것이 더 좋을 수도 있다.
- 보통 상태와 행동을 같이 둬야 자율적이기 때문에 기본적으로 전문가에게 책임을 할당하는 것이다.
- 책임을 찾고 책임을 수행할 적절할 객체를 찾아서 할당하는 방식을 책임주도 설계 (RDD, Responsibility-Driven Design)이라고 한다.
- 보통 책임 할당에 메시지를 식별하고 메시지 처리 객체를 나중에 선택한다는 것을 생각해보자. 객체가 메시지를 선택하는게 아니라 메시지가 객체를 선택한다. 이렇게 진행되는 이유가 있다.
- 최소한의 인터페이스를 가질 수 있게 한다.
- 추상적인 인터페이스를 가질 수 있게 한다.
- 또한, 행동은 상태를 결정한다. 객체의 존재 이유는 협력에 참여하기 위해서다.
- 협력에 필요한 행동을 제공해야 한다. 객체를 객체답게 만드는 것은 객체의 상태가 아니라 객체가 다른 객체에게 제공하는 행동이다.
역할
- 객체는 협력이라는 주어진 문맥 안에서 목적을 갖는다.
- 목적은 협력 안에서 객체가 맡게 되는 책임의 집합으로 표시된다.
- 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.
- 역할이 중요한 이유는 역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있기 때문이다.