출처 : 객체지향의 사실과 오해 조영호 저 | 위키북스
협력
- 협력은 한 객체가 다른 객체에게 도움을 요청할 때 시작된다.
이상한 나라의 재판
- 누군가 왕에게 재판을 요청함으로써 재판 시작
- 왕이 토끼에게 증인을 부를 것을 요청
- 왕의 요청을 받은 토끼는 모자 장수에게 증인석 입장을 요청
- 모자 장수는 증인석에 입장하여 토끼의 요청에 응답
- 모자 장수의 입장은 왕이 토끼에게 요청했던 증인 호출에 대한 응답이기도 함
- 왕은 모자 장수에게 증언할 것을 요청
- 모자 장수는 증언하여 왕의 요청에 응답

- 객체들이 특정한 요청을 받아들일 수 있는 이유는 그 요청에 대해 응답하는데 필요한 지식과 행동 방식을 가지고 있기 때문이다.
- 요청과 응답은 협력에 참여하는 객체가 수행할 책임을 정의함
책임
- 어떤 객체가 어떤 요청에 응답할 수 있거나 적절한 행동을 할 의무가 있는 경우 해당 객체는 책임을 가진다.
- 어떤 대상에 대한 요청은 그 대상이 요청을 처리할 책임이 있음을 암시
책임의 분류
객체가 무엇을 할 수 있는가 (doing)
- 객체를 생성 or 계산 등 스스로 하는 것
- 다른 객체의 행동을 시작시키는 것
- 다른 객체의 활동을 제어하고 조절하는 것
객체가 무엇을 알고 있는가 (knowing)
- 개인적인 정보에 관해 아는 것
- 관련된 객체에 관해 아는 것
- 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
책임의 분류 in 재판
- 왕 : 재판 집행이라는 책임을 수행하기 위해 토끼에게 목격자를 불러오도록 요청 + 모자 장수에게 증언 요청 -> 다른 객체들의 활동을 제어하고 조율
- 토끼 : 목격자가 모자 장수라는 사실을 알고 있으며 모자 장수가 증인석에 입장하도록 요청 -> 관련된 객체에 대해 아는 것 + 다른 객체의 행동을 시작 시키는 것
- 모자 장수 : 증인석에 입장해야 하는 책임 + 자신이 알고 있는 사실을 증언해야 할 책임 -> 객체를 생성하거나 게산을 하는 등의 스스로 하는 것 + 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것
책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소로 적절한 객체에게 적절한 책임을 할당해야 한다.
책임과 메시지
- 협력 안에서 객체는 요청이 왔을 때에만(메시지가 왔을 경우) 주어진 책임 수행
- 메시지는 협력에 참여하는 두 객체 사이의 관계를 강조
- 책임을 결정한 후 실제로 협력을 정제하면서 이를 메시지로 변환할 때는 하나의 책임이 여러 메시지로 분할되는 것이 일반적
- 책임과 협력의 구조를 완성하기 전까지 책임을 구현하는 방법은 나중에 고민
역할
- 굳이 왕을 판사라고 부르고 모자 장수를 증인이라고 부르는 이유는 역할이 재사용 가능하고 유연한 객체지향 설계를 낳는 매우 중요한 구성요소이기 때문이다.
- 재판이라는 협력 속에서 판사 역할과 증인 역할을 사용하면 판사가 왕비로 바뀌거나 증인이 요리사로 바뀌어도 재판은 그대로 진행 -> 협력을 추상화했기 때문에 역할은 협력 내에서 다른 객체로 대체 가능
- 역할을 대체할 수 있는 객체는 동일한 메시지를 이해할 수 있는 객체로 한정
- 동일한 역할을 수행할 수 있다는 것은 해당 객체들이 협력 내에서 동일한 책임(메시지)을 수행할 수 있다는 것
협력의 추상화
- 협력의 추상화는 협력의 개수를 줄이고 구체적인 객체를 추상적인 역할로 대체하여 단순화
- (왕-모자장수), (왕비-요리사)가 아닌 (판사-증인)의 역할로 추상화
대체 가능성
- 역할은 협력 안에서 구체적인 객체로 대체 가능
- 대체되기 위해서는 행동 호환 필수 -> 동일한 메시지 처리
- 왕은 판사도 하고 나라도 다스린다 -> 객체는 역할에 주어진 책임 이외의 다른 책임 수행 가능
객체의 모양을 결정하는 협력
- 오해
- 데이터를 저장하기 위해 객체가 존재? -> No! 데이터는 객체가 행위를 수행하는 데 필요한 재료일 뿐
- 객체지향은 클래스와 클래스 간의 관계(정적인 측면) 표현? No! 객체지향의 핵심은 정적인 클래스가 아니라 협력에 참여하는 동적인 객체
- 왕의 모습 (수염, 왕관, 왕좌)부터가 아닌 왕이 참여하는 협력 (재판, 정치)를 우선적으로 고려
협력을 따라 흐르는 객체의 책임
- 협력안에서 객체의 적절한 책임, 즉 행동을 결정
- 그 행동을 수행하는 데 필요한 데이터를 고려
- 클래스의 구현 방법 결정
객체를 충분히 협력적으로 만든 후 협력 안에서 충분히 자율적으로 설계
객체 지향 설계 기법
- 책임-주도 설계(Responsibility-Driven Design)
- 디자인 패턴(Design Pattern)
- 테스트-주도 개발(Test-Driven Development)
책임-주도 설계(Responsibility-Driven Design)
- 협력에 필요한 책임들을 식별 후 적합한 객체에게 책임을 할당
- 객체가 책임을 수행하는 도중 스스로 처리할 수 없는 경우 다른 적합한 객체에게 요청
- 객체들 간의 협력 관계 형성
- 시스템은 충분히 자율적인 동시에 충분히 협력적인 객체들로 구성
디자인 패턴(Design Pattern)
- 특정 문제를 해결할 때 반복적으로 사용되는 해결 방법 정의
- 공통으로 사용할 수 있는 역할, 책임, 협력의 템플릿
테스트-주도 개발
- 실패하는 테스트를 먼저 작성하고 테스트를 통과하는 구체적인 코드를 추가
- 리팩토링을 통해 중복을 제거하여 작동하는 깔끔한 코드 완성
- 객체가 이미 존재한다고 가정하고 객체에게 어떤 메시지를 전송할 것인지에 관해 먼저 생각
- 책임을 수행할 객체 or 클라이언트가 기대하는 객체의 역할이 메시지를 수신할 때 어떤 결과를 반환하고 어떤 객체와 협력할 것인지에 대한 기대를 코드의 형태로 작성
'JAVA > 객체지향의 사실과 오해' 카테고리의 다른 글
객체 지향의 사실과 오해 - 책임과 메시지 (0) | 2022.02.24 |
---|---|
객체 지향의 사실과 오해 - 타입과 추상화 (0) | 2022.02.11 |
객체 지향의 사실과 오해 - 이상한 나라의 객체 (0) | 2022.02.11 |
객체 지향의 사실과 오해 - 협력하는 객체들의 공동체 (0) | 2022.02.06 |