4장. 역할, 책임, 협력
최후통첩 게임 실험이 있다. 게임은 제안자와 응답자로 이루어져있으며, 제안자는 100만원을 응답자와 나누어가져야한다. 이때 나누는 비율은 제안자의 마음이며 응답자는 이를 수락하거나 거절할 수 있다. 거절하면 제안자, 응답자 모두 한 푼도 가져가지 못한다.
인간이 만약 합리적이라면 응답자는 1원 이상만 받으면 수락하는 것이 합리적이다. 0원보다야 낫기 때문이다. 하지만 실제 결과는 30% 미만의 금액을 제안한다면 대부분이 거절하였다.
이러한 결과는 인간은 이기적이고 합리적인 특성이 상황과 충돌하여 자신의 이익을 최소화하는 불힙리한 선택을 보여준다. 즉, 인간은 어떤 상황, 문맥에 존재하는 지가 행동 방식을 결정한다는 것이다.
객체의 세계에서도 문맥이 객체의 행동 방식을 결정한다.
협력
협력은 객체의 요청으로부터 시작된다. 요청을 받은 객체는 필요한 서비스를 제공하는 것으로 응답한다. 이러한 동작의 반복으로 협력은 다수의 요청과 응답으로 구성되며 연쇄적인 요청과 응답의 흐름으로 구성된다.
이상한 나라의 앨리스에서는 파이를 훔친 하트 잭에 대한 공판이 열린다. 그리고 재판에는 왕, 모자 장수, 앨리스 등 많은 인물이 등장한다. 등장 인물은 모두 객체이며, 재판을 위해 서로 협력하고 있다. 즉, 모든 객체들은 하트 잭의 재판이라는 동일한 목적을 달성하기 위해 협력하는 것이다.
협력은 당연히 객체들의 요청과 응답으로 이루어진다.
- 누군가가 왕에게 재판을
요청
한다. - 왕이 토끼에게 증인을
요청
한다. - 토끼는 모자 장수에게 증인석으로 입장할 것을
요청
한다. - 모자 장수는 증인석에 입장해 토끼의 요청과 왕의 요청에
응답
한다. - 왕은 모자 장수에게 증언을
요청
한다. - 모자 장수는 증언함으로써 왕에게
응답
한다.
요청과 응답에 초점을 맞춘다면 객체들이 협력하는 것을 확실하게 파악할 수 있다.
책임
객체지향에서는 어떤 객체가 어떤 요청에 대해 대답해 줄 수 있거나, 적절한 행동을 할 의무가 있는 경우 해당 객체가 책임을 가진다고 말한다.
- 왕은 재판 수행 요청에 응답해야하므로
재판을 수행할
책임을 가진다. - 토끼는 증인 요청에 응답해야하므로
증인을 데려올
책임을 가진다. - 모자 장수 역시
증언할
책임을 가진다.
결국 어떤 대상은 요청을 처리할 책임이 있다는 것이다 책임은 객체가 알아야하는 정보와 수행할 수 있는 행위에 대해 개략적으로 서술한 문장이다. 따라서 책임은 객체가 무엇을 알고 있는가
와 무엇을 할 수 있는가
로 구성된다.
- 왕은 다른 객체들에게 행동을
하게
한다. - 토끼는 모자 장수가 증인임을
알고 있고
, 증언을하게 한다
. - 모자 장수는
증인석에 입장해야하며
,알고 있는 사실
을 증언한다.
크게 보면 객체의 책임은 외부에 제공해줄 수 있는 정보
와 외부에 제공할 수 있는 서비스
의 목록이다. 따라서 책임은 객체의 공용 인터페이스를 구성한다.
협력 속에서 객체는 요청이 있을 때 책임을 수행한다. 이때 요청을 보내는 것을 메시지 전송이라 한다. 따라서 두 객체간 협력은 메시지를 통해 이루어진다. 요청하는 객체는 송신자이며, 처리하는 객체는 수신자이다. 메시지는 협력을 위해 객체가 다른 객체에 접근할 수 있는 유일한 방법이다.
이때 책임과 메시지의 수준이 같지는 않다. 책임을 메시지로 변환할 때에는 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다. 모자 장수가 증언하기 위해서는 여러 메시지가 필요할 수도 있고, 증언 이후 여러 메시지로 작용해 여러 객체의 협력을 일으킬 수도 있다.
역할
왕이 재판한다는 책임을 가지며 모자 장수는 증언할 책임이 있다는 것은 다른 말로 왕이 판사
라는 역할이며, 모자 장수는 증인
이라는 역할을 수행한다는 것이다. 즉, 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
역할은 재사용 가능하고 유연한 객체지향 설계를 낳는 중요한 구성요소다. 이후 앨리스가 증인
역할을 수행한다면 동일한 책임을 가질 수 있기 때문이다. 즉, 왕-모자장수
의 협력을 판사-증인
의 협력으로 추상화할 수 있다. 그리고 이러한 역할에는 다른 객체들이 이러한 역할을 수행할 수 있다.
이렇게 역할은 객체지향 설계의 단순성, 유연성, 재사용성을 뒷받침하는 핵심 개념이다.
그리고 역할은 협력을 추상화할 수 있다는 것이 핵심이다.
그로인해 역할은 협력 내에서 구체적인 객체로 대체될 수 있다. 하지만 객체가 역할에 주어진 책임 이외에 다른 책임도 수행할 수 있다는 사실에 주의하자. 요약하면 역할의 대체 가능성은 행위 호환성을 의미하고, 행위 호환성은 동일한 책임의 수행을 의미한다.
객체의 모양을 결정하는 협력
객체는 데이터를 저장하기 위한 수단이 아니다. 보다 본질적인 목적은 행위를 수행하며 협력하는 것이다.
다시 말하지만 클래스는 객체를 담기 위한 방법일 뿐이다.
왕이라는 객체를 생성한다면 왕관, 수염 등 구체적인 왕의 모습보다는 재판에서 판사
의 역할을 가졌다는 책임 수행이 더욱 중요하다.
올바른 객체를 설계하기 위해서는 깔끔한 협력을 설계해야한다. 협력을 설계하는 것은 객체들이 주고받을 요청과 응답의 흐름을 결정하는 것이다.
객체지향 설계 기법
책임-주도 설계 방법은 협력에 필요한 책임들을 식별하고 적합한 객체에게 책임을 할당하는 방법으로 설계한다. 핵심은 올바른 책임을 올바른 객체에 할당하는 것이다. 시스템의 기능은 더 작은 규모의 책임으로 분할되고 각 책임은 책임을 수행할 적절한 객체에게 할당된다. 객체가 수행할 수 없다면 다른 객체에 협력을 요청하며, 작업을 위임받으면 해당 객체의 책임으로 변환된다. 이처럼 시스템의 책임을 객체의 책임으로 변환하고 각 객체가 협력자를 찾아 책임을 할당하는 순차적인 방식으로 협력 공동체를 구축한다.
디자인 패턴은 반복적으로 사용하는 해결 방법을 정의해 놓은 설계 템플릿의 모음이다. 일반적으로 디자인 패턴은 반복적인 문제와 해법의 쌍으로 정의된다. 그 중 한 예시로 COMPOSITE 패턴을 살펴보자. 해당 패턴은 전체와 부분을 하나의 단위로 추상화해야하는 경우에 사용할 수 있는 패턴이다. 윈도우 탐색기에서 개별적 파일의 경로를 변경할 수도 있고, 디렉토리의 경로를 변경해 한 번에 여러 파일을 변경할 수도 있다. 사용자 입장에서는 변경하는 것이 개별 파일이든, 폴더이든 상관없다는 것이다. 여기서도 역할과 책임에 주목하자. 클라이언트는 컴포넌트에게 메시지를 요청한다. 폴더든 개별 파일이든 상관 없이 역할을 수행할 수 있다.
테스트-주도 개발은 테스트를 먼저 작성하고 구체적인 코드를 추가하며 완성하는 방법이다. 테스트 주도 개발은 테스트를 통과하는 가장 간단한 코드를 작성하기에 응집도가 높고 결합도가 낮은 클래스로 구성된 시스템을 개발하게 한다. 테스트 주도 개발은 책임 주도 설계를 통해 도달할 목적지를 테스트라는 안전장치로 빠르고 견고하게 도달하는 설계 프랙티스다. 테스트를 작성하기 위해 객체의 메서드를 호출하고 반환값을 검증하는 것이 객체가 수행해야할 책임에 대해 정의하는 것이다.
'etc > Book' 카테고리의 다른 글
[객체지향의 사실과 오해] 6장 객체 지도 (5일차) (0) | 2024.11.16 |
---|---|
[객체지향의 사실과 오해] 5장 책임과 메시지 (4일차) (0) | 2024.11.13 |
[객체지향의 사실과 오해] 3장 타입 추상화 (2일차) (1) | 2024.11.07 |
[객체지향의 사실과 오해] 1장 협력하는 객체들의 공동체, 2장 이상한 나라의 객체 (1일차) (9) | 2024.11.04 |
[Real MySQL 8.0] 10장 실행 계획 (9일차) (1) | 2024.11.02 |