본문 바로가기
그룹 스터디 공부(IT 서적)/오브젝트

03 역할,책임,협력

by hanyugyeong 2023. 7. 24.
반응형
SMALL
  • 캡슐화의 측면에서 합성이 더 좋은 방법이다.
  • 객체지향의 패러다임의 관점에서 핵심은 역할(role), 책임, 협력 이다.
  • 객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다.

01 협력

영화 예매 시스템 돌아보기

객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다. 

객체가 협력에 참여하기 위해 수행하는 로직은 책임이라고 부른다. 

객체들이 협력 안에서 수행하는 책임들이 모여 객체가 수행하는 역할을 구성한다. 

 

협력

-> 협력은 객체지향의 세계에서 기능을 구현할 수 있는 유일한 방법이다.

메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다.

메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 객체가 메시지를 처리할 방법은 스스로 선택하며 외부의 객체는 오직 메시지만 전송할 수 있을 뿐이며 메시지를 어떻게 처리할지는 메시지를 수신한 객체가 직접 결정한다. 

 

객체를 자율적으로 만드는 가장 기본적인 방법은 내부 구현을 캡슐화하는 것이다.

 

자율적인 객체는 자신에게 할당된 책임을 수행하던 중에 필요한 정보를 알지 못하거나 외부의 도움이 필요한 경우 적절한 객체에게 메시지를 전송해서 협력을 요청한다.           

 

협력이 설계를 위한 문맥을 결정한다.

객체란 상태와 행동을 함께 캡슐화하는 실행 단위이다. 

결론적으로 객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다. 

협력이 바뀌면 객체가 제공해야 하는 행동 역시 바뀌어야 한다.

ex) Movie의 행동을 결정하는 것은 영화 예매를 위한 협력이다. 

 

객체의 행동을 결정하는 것이 협력이라면 객체의 상태를 결정하는 것은 행동이다. 

객체의 상태는 그 객체가 행동을 수행하는 데 필요한 정보가 무엇인지로 결정된다. 

 

상태는 객체가 행동하는 데 필요한 정보에 의해 결정되고 행동은 협력 안에서 객체가 처리할 메시지로 결정된다. 

결과적으로 객체가 참여하는 협력이 객체를 구성하는 행동과 상태 모두를 결정한다. 

 

따라서 협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다. 

 

02 책임

책임이란 무엇인가 

협력에 참여하기 위해 객체가 수행하는 행동을 책임이라고 부른다

 

책임을 크게 하는 것아는 것의 두 가지 범주로 나누어 세분화하고 있다.

 

하는 것 

* 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것 

* 다른 객체의 행동을 시작시키는 것 

* 다른 객체의 행동을 제어하고 조절하는 것 

 

아는 것

* 사적인 정보에 관해 아는 것 

* 관련된 객체에 관해 아는 것 

* 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것 

 

Screening의 책임 : 영화를 예매하는 것 

Movie의 책임: 요금을 계산하는 것 

 

Screening 하는 것: 영화를 예매할 수 있어야 하는것 

Screening 아는 것 : 자신이 상영할 영화를 알고 있어야 한다. 

 

Movie 하는 것 : 예매 가격을 계산할 책임을 진다. 

Movie 아는 것 : 가격과 어떤 할인 정책이 적용됐는지 알고 있어야 한다. 

 

책임의 관점에서 '아는 것'과 '하는 것'이 밀접하게 연관돼 있다.

책임은 객체지향 설계의 핵심이다. 

크레이그 라만은 "객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것"이라는 말로 책임 할당의 중요성을 강조하기도 했다.

 

적절한 협력이 적절한 책임을 제공하고, 적절한 책임을 적절한 객체에게 할당해야만 단순하고 유연한 설계를 창조할 수 있다. 

 

책임 할당

자율적인 객체를 만드는 가장 기본적인 방법은 책임을 수행하는 데 필요한 정보를 가장 잘 알고 있는 전문가에게 그 책임을 할당하는 것이다. 이를 책임 할당을 위한 INFORMATION EXPERT(정보 전문가) 패턴이라고 부른다. 

 

객체지향 설계는 시스템의 책임을 완료하는 데 필요한 더 작은 책임을 찾아내고 이를 객체들에게 할당하는 반복적인 과정을 통해 모양을 갖춰간다. 

 

객체가 책임을 수행하게 하는 유일한 방법은 메시지를 전송하는 것이고 책임을 할당한다는 것은 메시지의 이름을 결정하는 것과 같다. 

 

예매하라라는 이름의 메시지로 협력을 시작하는 것이 좋을 것 같다. 

메시지를 선택했으면 메시지를 처리할 적절한 객체를 선택해야 한다. 정보 전문가에게 책임을 할당하면 됀다. 

영화 예매와 관련됀 정보를 가장 많이 알고있는 객체에게 책임을 할당하는 것이 바람직하다. 

영화를 예매하기 위해서는 상영 시간과 기본 요금을 알아야 한다. 

누가 해당 정보들을 알고있는가? -> Screening이다

Screening은 외부의 객체에게 가격 계산을 요청해야 한다. 

가격을 계산하라라는 이름의 새로운 메시지가 필요하다는 사실을 알게 됐다. 

가격을 계산하기 위해서는 가격과 할인 정책이 필요하다. 

이 모든 정보를 가장 잘 알고 있는 정보 전문가는 Movie다. 가격을 계산할 책임을 Movie에게 할당하자. 

가격을 계산하기 위해서는 다시 할인요금이 필요하다. 하지만 이는 Movie의 정보 전문 분야가 아니다. 

따라서 Movie는 요금을 계산하는 데 필요한 요청을 외부에 전송해야 한다. 할인 요금을 계산하라라는 새로운 메시지를 발견하게 된 것이다. 

 

객체지향 설계는 협력에 필요한 메시지를 찾고 메시지에 적절한 객체를 선택하는 반복적인 과정을 통해 이뤄진다. 그리고 이런 메시지가 메시지를 수신할 객체의 책임을 결정한다.

 

책임 주도 설계

요점은 협력을 설계하기 위해서는 책임에 초점을 맞춰야 한다는 것이다. 어떤 책임을 선택하느냐가 전체적인 설계의 방향과 흐름을 결정한다. 이처럼 책임을 갖고 책임을 수행할 적절한 객체를 찾아 책임을 할당하는 방식으로 협력을 설계하는 방법을 책임 주도 설계(RDD)라고 부른다.

책임을 할당할 때 고려해야 하는 두 가지 요소 

 

메시지가 객체를 결정한다

메시지를 먼저 식별하고 메시지를 처리할 객체를 나중에 선택하는것이 중요하다. 

객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 했다.

 

메시지가 객체를 선택하게 해야 하는 두 가지 중요한 이유가 있다. 

 

1) 객체가 최소한의 인터페이스를 가질 수 있게 된다. 

2) 객체는 충분히 추상적인 인터페이스를 가질 수 있게 됀다 : 인터페이스는 무엇을 하는지 표현해야 하지만, 어떻게 수행하는지는 노출해서는 안됀다. 메시지는 외부의 객체가 요청하는 무언가를 의미하기 때문에 메시지를 먼저 식별하면 무엇을 수행할지에 초점을 맞추는 인터페이스를 얻을 수 있다. 

 

객체가 충분히 추상적이면서 미니멀리즘을 따르는 인터페이스를 가지게 하고 싶다면 메시지가 객체를 선택하게 하라.

 

행동이 상태를 결정한다

객체가 존재하는 이유는 협력에 참여하기 위해서다. 따라서 객체는 협력에 필요한 행동을 제공해야 한다. 

객체를 객체답게 만드는 것은 객체의 상태가 아니라 객체가 다른 객체에게 제공하는 행동이다. 

 

내부 구현에 초점을 맞춘 설계 방법을 데이터-주도 설계(Data-Driven Design)라고 부르기도 했다. 

 

캡슐화를 위반하지 않도록 구현에 대한 결정을 뒤로 미루면서 객체의 행위를 고려하기 위해서는 항상 협력이라는 문맥 안에서 객체를 생각해야 한다. 

 

개별 객체의 상태와 행동이 아닌 시스템의 기능을 구현하기 위한 협력에 초점을 맞춰여만 응집도가 높고 결합도가 낮은 객체들을 창조할 수 있다. 

 

상태는 단지 객체가 행동을 정상적으로 수행하기 위해 필요한 재료일뿐이다.

 

객체가 가질 수 있는 상태는 행동을 결정하고 나서야 비로소 결정할 수 있다. 협력이 객체의 행동을 결정하고 행동이 상태를 결정한다. 그리고 그 행동이 바로 객체의 책임이 된다.

 

03 역할 

역할과 협력

객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다

 

 위 영화 예매 협력과정을 생각해 보자 

1) 영화를 예매할 수 있는 적절한 역할이 무엇인가를 찾는다. 

2) 역할을 수행할 객체로 Screening 인스턴스를 선택한다. 

 

익명의 역할을 찾은 후, 그 역할을 수행할 수 있는 객체를 선택하는 방식이다. 

 

유연하고 재사용 가능한 협력

역할이 중요한 이유는 역할을 통해 유연하고 재사용 가능한 협력을 얻을 수 있기 때문이다. 

 

만일 익명의 역할이 없다고 해보자. 

Movie가 가격을 계산히기 위해 "할인 요금을 계산하라" 라는 메시지를 보내면, AmountDiscountPolicy와 PercentDiscountPolicy 인스턴스 2가지가 메시지에 응답할수 있다. 

 

그렇다면 두 종류의 객체가 참여하는 협력을 다음과 같이 개별적으로 만들어야 할까?

순수하게 책임의 관점에서 두 협력을 바라보면 AmountDiscountPolicy와 PercentDiscountPolicy 모두 할인 요금 계산이라는 동일한 책임을 수행한다는 사실을 알 수 있다. 

동일한 책임을 수행할 대표자가 바로 역할이다.

여기서의 역할이 두 종류의 구체적인 객체를 포괄하는 추상화라는 점에 주목하라. 따라서 AmountDiscountPolicy와 PercentDiscountPolicy를 포괄할 수 있는 추상적인 이름을 부여해야 한다. 역할의 이름으로 DiscountPolicy가 어떨까?

 

객체 대 역할

역할은 객체가 참여할 수 있는 일종의 슬롯이다. 

협력에 참여하는 후보가 여러 종류의 객체에 의해 수행될 필요가 있다면 그 후보는 역할이 되지만 단지 한 종류의 객체만이 협력에 참여할 필요가 있다면 후보는 객체가 된다.

 

협력은 역할들의 상호작용으로 구성되고, 협력을 구성하기 위해 역할에 적합한 객체가 선택되며, 객체는 클래스를 이용해 구현되고 생성된다.

설계 초반에는 적절한 책임과 협력의 큰 그림을 탐색하는 것이 가장 중요한 목표여야 하고 역할과 객체를 명확하게 구분하는 것은 그렇게 중요하지는 않다는 것이다. 따라서 애매하다면 단순하게 객체로 시작하고 반복적으로 책임과 협력을 정제해가면서 필요한 순간에 객체로부터 역할을 분리해내는 것이 가장 좋은 방법이다. 

 

협력을 구체적인 객체가 아니라 추상적인 역할의 관점에서 설계하면 협력이 유연하고 재사용 가능해진다는 것이다. 

따라서 역할의 가장 큰 장점은 설계의 구성 요소를 추상화할 수 있다는 것이다. 

 

역할과 추상화 

추상화를 이용한 설계가 가실 수 있는 두가지 장점 

1) 추상화 계층만을 이용하면 중요한 정책을 상위 수준에서 단순화할 수 있다는 것이다. 

2) 설계가 좀 더 유연해진다는 것이다.

추상화가 가지는 두 가지 장점은 협력의 관점에서 역할에도 동일하게 적용될 수 있다. 

 

추상화의 장점 

1) 세부 사항에 억눌리지 않고도 상위 수준의 정책을 쉽고 간단하게 표현할 수 있다는 것이다. 

-> 불필요한 세부 사항을 생략하고 핵심적인 개념을 강조할 수 있다.

 

협력이라는 관점에서는 세부적인 사항을 무시하고 추상화에 집중하는 것이 유용하다. 

요금 계산에서 세부 사항은 할인 정책과 할인 조건의 종류다.

추상화는 할인 정책과 할인 조건이 조합되어 영화의 예매 요금을 결정한다는 사실이다. 

 

구체적인 할인 정책의 종류를 추상화한 DiscountPolicy와 상세한 할인 조건의 종류를 추상화한 DiscountCondition을 이용해서 협력을 표현하면 객체 사이의 핵심적인 상호작용이 좀 더 또렷하게 드러난다.

 

영화 예매 요금을 계산하기 위해 DiscountPolicy와 DiscountCondition의 인스턴스를 조합해야 한다는 사실과 Movie가 DiscountPolicy에게, DiscountPolicy가 DiscountCondition에게 메시지를 전송하며 협력한다는 사실이 명확해진다는 것을 알 수 있다.

 

구체적인 객체로 대체 가능한 DiscountPolicy와  DiscountCondition이 바로 역할이다. 

객체에게 중요한 것은 행동이라는 사실을 기억하라. 역할이 중요한 이유는 동일한 협력을 수행하는 객체들을 추상화할 수 있기 때문이다. 

 

2) 설계를 유연하게 만들 수 있다는 것이다. 

협력 안에서 동일한 책임을 수행하는 객체들은 동일한 역할을 수행하기 때문에 서로 대체 가능하다. 

 

영화 예매 시스템에서 DiscountPolicy와 DiscountCondition이라는 역할을 수행할 수 있는 어떤 객체라도 예매 요금을 계산하는 협력에 참여할 수 있었다. 다시 말해서 다양한 종류의 할인 정책과 할인 조건에도 적용될 수 있는 협력을 만들었다는 것을 의미한다. 

 

 

 

 

 

 

반응형
LIST

'그룹 스터디 공부(IT 서적) > 오브젝트' 카테고리의 다른 글

05 책임 할당하기_02  (0) 2023.08.09
05 책임 할당하기_01  (0) 2023.08.07
04 설계 품질과 트레이드 오프  (0) 2023.07.31
02 객체지향 프로그래밍  (0) 2023.07.23
01.객체, 설계  (0) 2023.07.23