본문 바로가기
스터디

[오브젝트] 3장. 역할, 책임, 협력

by eunoo 2023. 7. 27.

객체지향 설계를 할 때는 역할, 책임, 협력 이 세 요소가 조화롭게 이뤄져야 한다. 각 요소가 어떤 개념을 가지는지 알아보고, 이 세 가지를 이용하여 객체지향 설계를 어떻게 해야하는지 알아보자.

 

협력

객체지향은 협력하는 객체들의 공동체라고 했다. 객체를 설계할 때 처음으로 해야 할 것은 어떤 협력이 이루어지는가를 파악하는 것이다. 

따라서 협력이 설계의 문맥을 결정한다. '어떤 협력을 할 것인가'가 행동을 결정하고, 행동이 상태를 결정한다.

 

ex) 영화 예매하기 기능을 구현하려고 한다. 여기선 영화 예매라는 협력이 이루어이고, '예매하라'라는 행동이 필요하다. 그리고 이 행동을 하기 위해선 '상영 시간, 기본 요금'이라는 상태가 필요하다.

 

책임

어떤 협력을 할 것인가를 결정했으면, 이제 책임을 파악하고, 그 책임을 할당할 객체를 선택한다.

 

ex) 영화 예매라는 협력에서 필요한 행동은 '예매하라'이다. 예매하는 책임을 어떤 객체에게 할당할 것인가? Screeing이 적합하다.

그 다음 영화를 예매하기 위해선 예매 가격을 계산해야 한다. Screeing은 예매하는 책임은 가지고 있지만, 영화 가격에 대해선 알지 못한다. 따라서 '가격을 계산하라'라는 새로운 행동을 다른 객체에게 요청해야 한다. 가격을 계산하는 책임은 어떤 객체가 가져야 적합할까? Movie가 적합하다. 

 

객체지향 설계는 협력에 필요한 메시지를 찾고, 메시지에 적합한 객체를 선택하는 반복적인 과정을 통해 이뤄진다. 이러한 설계가 바로 책임 주도 설계이다. 

책임 주도 설계 : 시스템에 필요한 책임을 파악한 후, 책임을 수행할 적절한 객체를 찾아 그 객체에게 책임을 할당한다.

 

역할

사실 객체지향의 사실과 오해에서 이 세 가지 요소에 대해 설명했을 때, 역할은 책임의 개념과 비슷하다고 생각했다. 그래서 역할이라는 단어를 굳이 강조하는 이유가 무엇일까 의아했는데, 이 책에선 잘 이해할 수 있었다.

 

역할이라는 개념이 필요한 이유는 바로 재사용성때문이다. 어떤 책임이 할당된 객체에게 역할이라는 개념이 없으면, 중복이 발생한다.

 

ex) Movie는 가격 계산이라는 책임을 가졌다. 이제 '할인 요금을 계산하라'라는 메시지가 필요하다. 이 메시지는 AmountDiscountPolicy 객체와 PercentDiscountPolicy 객체에게 적합한 것 같다. 여기서 역할이라는 개념이 없으면 두 할인 정책을 실행하는 협력이 각각 따로 이뤄져야 한다. 하지만 여기에 DiscountPolicy라는 역할로 추상화하면 하나의 협력만 이뤄질 수 있다. 즉 하나의 협력을 재사용할 수 있다.

 

굉장히 헷갈리는 설명을 하는데, 협력에 적합한 책임을 수행하는 대상이 한 종류라면 객체로 간주하지만, 여러 객체들이 참여할 수 있다면 역할이라고 부르면 된다고 한다. 굳이 이렇게까지 설명할 필요가 있나 싶다;

 

아무튼 저자의 개인적 견해는 다음과 같다. 설계 초반에는 협력과 적절한 책임의 큰 그림을 파악하는 것이 중요하다. 역할과 객체를 명확하게 구분하는 것은 그리 중요하지 않으니, 애매하다면 객체로 시작하고 반복적으로 책임과 협력을 정제하면서 필요한 순간에 객체로부터 역할을 분리하라.

 

역할을 이해하는데에는 이 예시가 제일 적합한 것 같다.

연극 안에서 배역을 연기하는 배우 = 협력 안에서 역할을 표현하는 객체

 

 

댓글