4장. 역할, 책임, 협력
우리 모두를 합친 것보다 더 현명한 사람은 없다. - 켄 블랜차드
객체지향에 갓 입문한 사람들의 가장 흔한 실수는 협력이라는 문맥을 고려하지 않은 채 객체가 가져야 할 상태와 행동부터 고민하기 시작한다는 것이다.
여기서 중요한 것은 개별 객체가 아니라 객체들 사이에 이뤄지는 협력이다.
[ 책임 ]
크레이그 라만은 아래 분류 체계에 따라 객체의 책임을 크게 "하는 것" 과 "아는 것" 의 두 가지 범주로 분류하고 있다.
책임은 객체의 외부에 제공해 줄 수 있는 정보(아는 것)와 외부에 제공해 줄 수 있는 서비스(하는 것)의 목록이다.
한 가지 주의할 점은 책임과 메시지의 수준이 같지는 않다는 점이며, 책임은 객체가 협력에 참여하기 위해 수행해야 하는 행위를 상위 수준에서 개략적으로 서술한 것이다.
협력을 정제하면서 이를 메시지로 변환할 때는 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다.
책에서 나온 스토리를 통한 예시 설명
재판중인 곳에 앨리스가 들어섰다.
판사는 다름 아닌 한 나라의 "왕" 이었고, 판사가 첫번째 목격자를 호명한다.
첫번째 목격자인 "모자 장수"가 등장하였고, 왕은 모자 장수에게 증언하라고 명령했다.
[ 역할 ]
어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
위 책임에서 나온 이야기 중 "왕"을 판사라고 부르고, "모자 장수"를 증인이라고 불러 상황을 복잡하게 만든 이유가 무엇일까?
역할이 재사용 가능하고 유연한 객체지향 설계를 낳는 매우 중요한 구성요소이기 때문이다.
책에서 나온 스토리를 통한 예시 - 재판 과정에서 모자 장수가 퇴장하는 장면 부터
"왕"은 "하얀 토끼"에게 다음 증인을 부르라고 명령했다.
다음 증인은 "공작 부인의 요리사" 였고 그가 법정에 들어서자 "왕" 은 다시 증언하라고 명령했다.
"요리사"는 왕의 명령을 어기고 싫다고 말 하고 사라졌다.
"왕"은 다음 증인을 부르라고 "하얀 토끼"에게 명령하였고, 다음 심문부터는 "여왕"에게 진행해달라고 부탁하였다.
"여왕"은 다음 증인에게 증언하라고 명령했다.
이 이야기에서 "왕과 여왕", "모자 장수와 요리사" 는 각자 인물만 다를 뿐 판사와 증인이라는 역할은 언제나 같다.
여기서 객체지향 관점에서 보면, 역할을 이용해 협력을 추상화했기 때문에 "판사"나 "증인"의 역할을 수행할 수 있는 어떤 객체라도 협력에 참여할 수 있게된다.
결국 동일한 역할을 수행할 수 있다는 것은 해당 객체들이 협력 내에서 동일한 책임의 집합을 수행할 수 있다는 것을 의미한다.
즉, 역할의 가장 큰 가치는 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 함으로써 협력을 추상화할 수 있고, 이로써 단순화된다.
객체가 역할을 대체하기 위해서는 행동이 호환돼야 한다는 점에 주목해야한다. 객체가 역할을 대체 가능하기 위해서는 협력 안에서 역할이 수행하는 모든 책임을 동일하게 수행할 수 있어야 한다.
[ 객체의 모양을 결정하는 협력 ]
객체가 상태의 일부를 데이터로 포함하는 것은 사실이지만 데이터는 단지 객체가 행위를 수행하는 데 필요한 "재료"일 뿐이다.
객체가 존재하는 이유는 행위를 수행하며 협력에 참여하기 위해서다. 따라서 실제로 중요한 것은 객체의 행동, 즉 "책임"이다.
선입견
객체지향에서 데이터나 클래스를 중심으로 설계하는 이유는 위 언급되는 이야기의 "왕" 을 모델링할 경우, 대부분의 사람들은 왕관을 쓰고 멋진 수염을 기른 채 근엄한 표정으로 왕좌에 앉아있는 왕의 모습을 떠올린다.
그리고, 그렇게 떠올린 왕의 모습을 기반으로 클래스를 개발하기 시작한다.
이렇게 생성되는 데이터 기반 클래스는 추후 다른 객체와 협력할 때의 왕은 왕관, 수염, 근엄함 은 사실 어플리케이션에서 아무런 필요가 없다.
그저 "증언하라" 라고 명령하고 토끼에게 증인을 부르라고 명령하는 행위에 집중해야 할 뿐이다.
다시 설계 관점으로 살펴보면 실제로 동작하는 어플리케이션을 구축하기 위해서는 왕이 참여하는 "협력"을 우선적으로 고려해야 한다.
즉, 행동을 결정한 후에 행동을 수행하는 데 필요한 데이터를 고민해야 한다.
Last updated