본문 바로가기
SW core/객체지향

객체지향의 사실과 오해 - 역할, 책임, 협력

by ocwokocw 2021. 8. 13.

- 이 글은 조영호의 객체지향의 사실과 오해를 기반으로 작성되었습니다. (가능하면 꼭 읽어보는것을 추천드립니다.)

- 협력

협력은 한 사람이 다른 사람에게 도움을 요청할 때 시작한다. 요청받은 사람은 일을 처리한 후 요청자에게 응답하는데 만약 자신이 혼자서 처리할 수 없는 일을 맞이하면 다른사람에게 요청한다. 이처럼 협력은 다수의 연쇄적인 요청과 응답으로 구성되어 있다.

 

이상한 나라의 엘리스에서 하트 잭은 파이를 훔쳤다는 혐의로 재판을 받는다. 판사 역할을 맡은 왕은 토끼에게 증인을 부르라고 명령한다. 모자장수가 증인으로 등장하고 증언을 마친 후 퇴장한다.

 

이렇게 하트 잭을 재판하는 과정은 일종의 협력이라고 볼 수 있다.

위의 다이어그램은 재판의 과정을 도식화하여 나타낸 UML 협력 다이어그램이다. 재판 요청자, 왕, 토끼, 모자장수가 등장한다. 등장인물 간에 이어진 선은 역할(Role) 간에 연관(Association) 이 있음을 의미하는 AssociationRole 이다. 선위의 화살표들은 방향성이 있는 메시지 전송을 나타내는데, AssociationRole 이 있어야 화살표를 나타낼 수 있다.


- 책임

어떤 하나의 객체가 다른 객체에게 요청을 했다면 요청을 받은 해당 객체는 그 행위를 할 책임을 지니고 있기 때문이다. 왕은 재판을 수행할 책임을, 토끼는 증인을 불러오는 책임을, 모자장수는 증언할 책임을 갖고 있기 때문이다.

 

객체의 책임은 2 부분으로 구성되는데 알고 있는것과 할수 있는것으로 구성된다.

하는 것(Doing)

  • 객체를 생성하거나 계산하는 등 스스로 수행하는것
  • 다른 객체의 행동을 시작시키느 것
  • 다른 객체의 활동을 제어하고 조절하는 것

알고 있는 것(Knowing)

  • 개인적인 정보에 관해 아는 것
  • 관련된 객체에 관해 아는 것
  • 자신이 유도하거나 계산할 수 있는것에 관해 아는 것

객체의 책임에 관해 이야기할 때는 외부에서 접근 가능한 서비스 관점에서 이야기한다. 책임은 객체의 외부에 제공해 줄 수 있는 정보(Knowing) 와 제공해 줄 수 있는 서비스(Doing) 의 목록이다. 따라서 책임은 객체의 공용 인터페이스(public interface) 를 구성한다.

 

일반적으로 하나의 책임이라는 것은 해야하는 행위를 상위 수준에서 개략적으로 나타낸것이다. 책임을 결정한 후 이를 메시지로 변환할 때에는 하나의 책임이 여러 메시지로 분할된다.

 

나를 비롯한 보통 개발자들은 설계를 처음시작할 때부터 책임을 어떻게 구현할지를 머릿속에 떠올리는 경향이 있다. 이는 협력에서 객체간의 상호작용을 설계를 약화시킨다. 협력에서 객체의 책임을 먼저 설계한 후 뒤늦게 구현방법을 고민해도 늦지 않는다.


- 역할

위의 시나리오에서 모자장수, 토끼, 왕은 각각 자신만의 책임을 지니고 있었다. 그리고 모자장수는 증인이라는 역할을 수행했으며 왕은 판사라는 역할을 수행했다. 그냥 왕은 왕이고, 모자장수는 모자장수일뿐인데 왜 굳이 역할 이라는 단어를 사용하면서 판사와 증인이라는 새로운 단어를 끌어들였는가? 

 

왕은 모자장수 뿐만 아니라 요리사를 불러 재판을 하였다. 그 후 왕은 앨리스를 소환하였고 급격히 피로감을 느껴 여왕에게 재판을 위임했다.

 

앞의 글에서도 잠시 언급했던적이 있지만 역할에는 대체 가능성이 있다고 했다. 만약 역할이라는 개념없이 사람(객체)만 바뀌어서 진행된 재판과정을 모두 서술하면 또 다른 새로운 증인이나 새로운 판사가 나타나면 또 다시 새로운 재판과정을 서술해야 한다. 이렇게 다른 객체들이 여러 재판과정을 수행했지만 그 여러 재판과정의 행위들이 거의 비슷하다면 이를 역할로 치환하면 하나의 협력과정으로 재사용할 수 있다.

첫번째 협력 다이어그램과 달라진점은 왕, 토끼, 모자장수 대신 역할의 이름이 들어갔다는 것이다. 이제 각 역할에 어떤 객체들이 오더라도 이는 하나의 협력 과정으로 추상화 된다.

 

하지만 아무나 증인의 역할을 수행할 수는 없다. 증인은 입장하고 증언하는 행위를 할 수 있는 객체만이 증인 역할을 수행할 수 있다. 이는 객체가 해당 역할을 수행하기 위해서는 행위가 호환되어야 한다는 것을 의미한다.

댓글