1. 협력
객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 의미한다. 2장에서 언급했듯이 객체지향 시스템은 자율적인 객체들의 공동체다. 메시지 전송은 객체 사이의 도움을 요청하는 커뮤니케이션 수단이다. 메시지를 수신한 객체는 스스로 어떻게 처리할지는 직접 결정한다. 이것은 객체가 자신의 일을 스스로 처리할 수 있는 자율적인 존재라는 것을 의미한다.
레이싱 경주를 떠올려보자 Race는 각 차량에 대한 정보를 알지 못한다. 차량의 정보와 얼마나 움직일 수 있는지 등 차량에 관련된 정보는 Car객체가 잘 알고 있으므로 메시지를 통해 자신의 일을 위임한다. 자신이 할 수 없는 일을 다른 객체에게 위임하면 협력에 참여하는 객체들의 전체적인 자율성을 향상할 수 있다.
2. 책임
객체가 협력에 참여하기 위해 수행하는 행동
2.1 하는 것과 아는 것
크레이그 라만은 객체의 책임을 크게 하는 것과 아는 것의 두 가지 범주로 나누어 세분화하고 있다.
객체지향 개발에서 가장 중요한 능력은
책임을 능숙하게 소프트웨어 객체에 할당하는 것
크레이그 라만
하는 것
- 객체를 생성하거나 계산을 수행하는 등 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어, 조절하는 것
아는 것
- 사적인 정보에 관해 아는 것
- 관련된 객체에 아는 것
- 계산할 수 있는 것에 관해 아는 것
아까 경주에서 Race의 책임은 경주를 시작하는 것이다. Car의 책임은 차량을 이동하는 것이다. 각자의 책임에 따라 각자가 알고 있어야 하는 것이 있다.
2.2 책임 할당
자율적인 객체를 만드는 가장 기본적인 방법은 책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 객체에게 책임을 할당하는 것이다. 일상생활에서도 아프면 의사 선생님을 찾고, JPA에 대해 알고 싶으면 김영한 강사님을 찾는 등 그 분야의 전문가를 찾는 것은 일상생활에서도 적용된다.
객체가 책임을 수행하게 하는 유일한 방법은 메시지를 전송하는 것이므로 책임을 할당하는 것은 메시지의 이름을 경정하는 것과 같다. 위의 경주를 예시를 보면 Move()를 통해 움직여라 라는 메시지를 전송해 협력을 시작한다. 그다음 차량에 관련된 정보를 가장 많이 알고 있는 객체에게 책임을 할당한다. 위에선 Car객체에게 책임을 할당한다.
3. 역할
객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합
간단하게 놀이공원에서 표를 구매한다고 생각해 보자. 어른, 청소년, 유아, 노약자 등등 사람마다 가격이 다르다. 이럴 경우
계산하다(어른), 계산하다(유아), 계산하다(청소년)...
이렇게 메서드를 각각의 객체에 따라 다른 메서드를 만들어야 할까?? 만약 계산하다 라는 메시지에 응답할 수 있는 고객이라는 대표자를 만들어 여러 사람들을 하나로 통합할 수 있을 것이다.
계산하다(고객)
이렇게 고객을 통해 여러 종류의 객체를 교대로 바꿔 끼울 수 있는 일종의 슬롯이라 생각할 수 있다. 이게 바로 역할이다. 또 다른 예시로 게임기에 CD만 바꿔 끼워도 여러 게임을 플레이할 수 있듯이 CD가 역할이고 그 안에 철권, 뿌요뿌요 등등 여러 객체를 사용해 다양한 게임을 즐길 수 있다.
3.1 역할의 구현
이전 2장에서 인터페이스와 추상 클래스에 대해 살펴봤다. 둘 다 협력의 관점에서 구체 클래스들이 따라야 하는 책임의 집합을 서술한다.
- 추상 클래스는 책임의 일부를 구현해 놓은 것
- 인터페이스는 일체의 구현 없이 책임의 집합만을 나열해 놓은 것
'Study > 오프젝트' 카테고리의 다른 글
06) 메시지와 인터페이스 (0) | 2023.12.15 |
---|---|
05) 책임 할당하기 (0) | 2023.12.11 |
04) 설계 품질과 트레이드오프 (1) | 2023.12.07 |
02) 객체지향 프로그래밍 (0) | 2023.11.29 |
01) 객체, 설계 (2) | 2023.11.27 |