객체지향 패러다임의 핵심은 3가지이다.
객체 지향 설계의 핵심은 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정에서 드러난다.
Bottom Up: 구현 및 설계
Top Down: 설계 및 구현
협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시작된다. 협력을 위한 커뮤니케이션 수단은 메시지 전송이다.
메시지를 수신한 객체는 요청을 처리할 방법을 스스로 선택해 요청에 응답한다. 이것은 객체가 자율적인 존재라는 것을 의미한다.
애플리케이션에 어떤 객체가 필요하다면 이유는 하나다. 그 객체가 어떤 협력에 참여하기 때문이다.
협력에 참여하는 것은 적절한 행동을 가진 거다. 이는 협력이 객체의 행동을 결정하고, 행동에 필요한 정보에 따라 객체의 상태를 결정한다.
결론적으로 협력이 객체의 행동과 상태를 모두 결정하며, 설계에 필요한 문맥(context)를 제공한다.
협력에 참여하기 위해 객체가 수행하는 행동을 책임이라 한다. 객체의 책임은 두 가지로 분류된다.
첫째, 하는 것(doing): 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것, 다른 객체의 행동, 활동을 제어하고 조작하는 것
둘째, 아는 것(knowing): 사적인 정보, 관련된 객체에 아는 것, 스스로 계산할 수 있는 것에 아는 것
즉, 책임은 객체의 외부에 제공해줄 수 있는 정보(knowing)와 외부에 제공해줄 수 있는 서비스(doing)의 목록이다.
객체가 다른 객체에게 책임을 수행하도록 요청을 보내는 것을 메시지 전송이라고 한다.
한 가지 주의할 점은 책임과 메시지의 수준이 같지 않다는 점이다. 책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이므로, 책임을 결정, 정제 후 변환하면 여러 메시지로 분할이 된다.
객체지향 설계는 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야하고 어떤 객체로부터 메시지를 수신할 것인지를 결정하는 것으로부터 시작된다. 어떤 클래스가 필요하고 어떤 메소드를 포함해야 하는지 결정하는 것은 책임과 메시지에 대한 대략적인 윤곽을 잡은 후에 시작해도 늦지 않다.
: 프로그래밍의 책임을 찾고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법
책임 주도 설계는 자연스럽게 객체의 구현이 아닌 책임에 집중할 수 있게 한다.
구현이 아닌 책임에 집중하는 것이 중요한 이유는 유연하고 견고한 객체 지향 시스템을 위해 가장 중요한 재료가 바로 책임이기 때문이다.
객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다.
역할은 다른 것으로 교체할 수 있는 책임의 집합이다.
예를 들어 선생님은 수업을 진행할 책임이 있는 동시에 학생의 안전을 지킬 책임이 있다. 이렇게 여러 책임이 모여 선생님이라는 역할을 만든다.
그리고 선생님이라는 역할은 학원 선생님, 학교 선생님 등등 어떤 선생님으로 교체될 수 있고, 어떤 객체인지에 상관없이 수업 진행이라는 책임을 수행할 수 있다.
더블 캐스팅은 연극, 뮤지컬에서 두 사람에게 동시에 한 배역을 맡긴다.
여기서 연극은 협력, 배역은 역할, 배우는 객체로 이해할 수 있다.
배우와 배역의 관계
- 서로 다른 배우들이 동일한 배역을 연기할 수 있다.
- 한 배우가 다양한 연극 안에서 서로 다른 배역을 연기할 수 있다.
객체와 역할의 관계
- 서로 다른 객체들이 동일한 역할을 수행할 수 있다.
- 한 객체가 다양한 협력 안에서 서로 다른 역할을 수행할 수 있다.
협력이라는 문맥 안에서 역할은 특정한 협력에 참여해서 책임을 수행하는 객체의 일부다.
일반적으로 역할은 객체가 협력에 참여하는 잠시 동안에만 존재하는 일시적인 개념이다.
역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있다.
역할에 집중하면 추상적인 네이밍을 가져도 문맥은 유지가 되고, 비슷한 구현의 다른 객체를 추가하는데 큰 비용이 들지 않는다.
객체에게 중요한 것이 행동임은 변함이 없다. 역할은 동일한 협력을 수행하는 객체들을 추상화할 수 있다.
역할을 구현하는 가장 일반적인 방법은 추상화와 인터페이스다. 협력의 관점에서 바라보면 추상화와 인터페이스는 구체 클래스들이 따라야 할 책임의 집합을 서술한 것이기 때문이다.
출처