반응형
Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

지식조각모음

역할, 책임, 협력 본문

책/객체지향의 사실과 오해

역할, 책임, 협력

y00 2023. 8. 17. 15:58
반응형

인간의 행동은 문맥(context)에 따라 결정된다. 객체지향의 세계에서도 그렇다. 객체들 간의 협력에 집중하라.

협력

협력은 도움을 요청하면서 시작된다. 도움을 주던 객체도 도움을 요청할 수 있다. 결국 협력은 다수의 연쇄적인 요청과 응답의 흐름으로 구성된다. 각 객체는 요청에 대해 적절히 응답할 수 있다. 이 요청과 응답이 객체가 협력 안에서 해야할 책임을 정의한다.


책임

책임의 분류

p. 115
객체의 책임은 ‘객체가 무엇을 알고 있는가(knowing)’와 ‘무엇을 할 수 있는가(doing)’로 구성된다.
  • 하는 것
    • 객체를 생성하거나 계산하는 등의 스스로 하는 것
    • 다른 객체의 행동을 시작시키는 것
    • 다른 객체의 활동을 제어하고 조절하는 것
  • 아는 것
    • 개인적인 정보에 관해 아는 것
    • 관련된 객체에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

예를 들어 왕은 ‘재판을 수행하라’는 요청을 받았기 때문에 재판을 수행할 책임이 있다. 또한 책임을 수행하기 위해 하얀 토끼와 모자 장수에게 요청한다. 따라서 왕은 ‘다른 객체들의 활동을 제어하고 조율’하고 있으며 이에 대한 책임을 수행한다.

각 등장인물과 수행 하는 일


책임과 메시지

  • 메시지 전송: 다른 객체에게 주어진 책임을 수행하도록 요청을 보내는 것

책임을 언제 수행하는가? 다른 객체들에게 요청이 왔을 때 수행한다. 즉 메시지가 전송되었을 때 책임을 수행하며, 협력은 메시지를 통해 이뤄진다. 서로 다른 객체가 협력할 수 있는 이유는 이해할 수 있는 메시지를 전송하고, 메시지에 적절하게 응답할 수 있기 때문이다. 또한 책임을 수행한다는 것은, 요청을 수신할 수 있다는 사실을 암시한다.
다만 책임과 메시지의 수준이 같지 않다. 책임이 더 상위 수준이며 하나의 책임이 여러 메시지로 분할되는 것이 일반적이다.


역할

어떤 책임을 수행한다는 것은 어떠한 역할을 수행한다는 뜻

수행하는 일은 동일하지만 객체가 달라졌다.

위 그림과 달라진 것은 왕이 여왕으로 바뀌고 모자장수가 앨리스로 바뀌었다는 것 뿐이다. 그러면 두 그림을 다른 협력관계로 봐야할까? 서로 다른 협력이 있을 때 객체의 타입만 다를 뿐 책임이 동일하다면 이 협력은 서로 별도로 관리해야 할까?

아니다. 협력 과정 속에서 각 객체는 ‘역할(role)’을 가진다. 이 역할을 통해 협력을 하나로 추상화 할 수 있다. 역할은 다른 객체로 대체할 수 있음을 나타내는 표식이다. 동일한 요청을 받아 적절하게 응답할 수 있는 객체는 누구나 이 역할을 수행할 수 있게 된다.

동일한 역할 == 동일한 책임

협력의 추상화

왕, 여왕을 '판사'라는 역할로, 모자장수, 앨리스는 '증인'이라는 역할로 추상화 하였다. 이로써 모든 협력관계는 하나로 단순화 할 수 있게 되었다. 같은 역할을 할 수 있다면 판사의 자리에 어떤 객체가 와도 상관없다.

역할을 이용해 협력을 추상화하여 단순화 할 수 있다. 그러면 동일한 구조의 협력을 다양한 문맥에서 재사용할 수 있게 된다.
하지만 하나의 객체는 여러 역할을 가질 수 있다. 즉 하나의 객체가 가지는 책임이 하나 이상일 수 있다. 예를 들어 왕의 경우 판사의 책임과 왕의 책임을 가진다. 이런 경우 객체의 타입과 역할 사이에는 일반화/특수화 관계가 성립한다. 역할은 일반화이며 객체 타입은 특수화다.


객체의 모양을 결정하는 협력

데이터나 클래스가 아닌 협력이라는 문맥을 고려해야 한다. 중요한 것은 책임이 아니다.

  • 협력 설계하기
    • 객체끼리의 요청과 응답의 흐름 결정 -> 책임
    • 책임 즉 행동을 수행하기 위한 데이터 고려
    • 클래스 구현 방법 결정

객체지향 설계 기법

  1. 책임-주도 설계
    • 시스템의 기능은 더 작은 규모의 책임으로 분할되고, 각 책임은 책임을 수행할 적절한 객체에게 할당된다. 스스로 처리할 수 없는 경우 적절한 객체를 찾아 필요한 작업을 요청한다.
  2. 디자인 패턴
    • 책임-주도 설계의 결과, 모범이 되는 설계
    • 문제와 그 해법에 대한 정의
  3. 테스트-주도 개발
    • 테스트보다 책임을 수행할 객체가 기대하는 객체의 역할, 어떤 메시지를 주고 받을 것인가, 어떤 결과를 반환하고 그 과정에서 어떤 객체와 협력하는가에 대한 기대를 작성하는 것

정리

- 협력에 참여하기 위해 어떤 객체가 어떤 책임을 수행해야 하고 메시지를 수신하고 응답할 것인지를 결정하는 것에서 시작된다.
- 동일한 책임을 수행한다면 역할로 추상화 할 수 있다. 따라서 호환이 가능하고 이를 통해 협력을 추상화 할 수 있다.
반응형

' > 객체지향의 사실과 오해' 카테고리의 다른 글

객체 지도  (0) 2023.09.06
책임과 메시지  (0) 2023.08.31
타입과 추상화  (0) 2023.08.14
이상한 나라의 객체  (0) 2023.08.08
협력하는 객체들의 공동체  (0) 2023.08.01