오브젝트 Ch.3

Manx·2022년 5월 10일
0
post-thumbnail

'오브젝트: 코드로 이해하는 객체지향 설계' 1주차
분량 : 1장 ~ 5장
기간 : 22.5.7 ~ 22.5.14

Ch.3 역할, 책임, 협력

객체지향 패러다임의 관점에서 핵심은 역할(role), 책임(responsibility), 협력(collaboration)이다.
객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다.

협력

객체지향 시스템은 자율적인 객체들의 공동체다.
협력은 객체지향의 세계에서 기능을 구현할 수 있는 유일한 방법이다.


자율적인 존재

  • 외부의 객체는 오직 메시지만 전송할 수 있을 뿐이며, 메시지를 어떻게 처리할지는 메시지를 수신한 객체가 스스로 결정

자신이 할 수 없는 일을 다른 객체에게 위임하면 협력에 참여하는 객체들의 전체적인 자율성을 향상시킬 수 있다.
가장 기본적인 방법은 내부 구현을 캡슐화하는 것이다.

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

애플리케이션 안에 어떤 객체가 필요하다면 그 이유는 단 하나여야한다.
그 객체가 어떤 협력에 참여하고 있기 때문이다.
객체가 협력에 참여할 수 있는 이유는 협력에 필요한 적절한 행동을 보유하고 있기 때문.
객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다.
협력이 존재하기 때문에 객체가 존재하는 것이다.

협력이 객체를 구성하는 행동과 상태 모두를 결정한다. 따라서 협력은 객체를 설계하는 데 필요한 일종의 문맥을 제공한다.


책임

협력에 참여하기 위해 객체가 수행하는 행동을 책임이라 한다.
책임을 크게 '하는 것(doing)'과 '아는 것(knowing)'의 두가지 범주로 나누어 세분화한다.

  • 하는 것
    • 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
    • 다른 객체의 행동을 시작시키는 것
    • 다른 객체의 활동을 제어하고 조절하는 것
  • 아는 것
    • 사적인 정보에 관해 아는 것
    • 관련된 객체에 관해 아는 것
    • 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

어떤 책임을 수행하기 위해서는 그 책임을 수행하는 데 필요한 정보도 함께 알아야 할 책임이 있다.
적절한 협력이 적절한 책임을 제공하고, 적절한 책임을 적절한 객체에게 할당해야만 단순하고 유연할 설계를 창조할 수 있다.

객체지향 설계에서 가장 중요한 것은 책임이다.

책임 주도 설계

  • 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
  • 시스템 팩임을 더 작은 책임으로 분할한다.
  • 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
  • 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
  • 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 된다.

메시지가 객체를 결정하게 한다.

객체에게 책임을 할당하는 데 필요한 메시지를 먼저 식별하고 메시지를 처리할 객체를 나중에 선택했다는 것이 중요하다. 다시 말해 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 했다.

해석 : 어떤 행동을 하기 위해 메시지가 필요하고, 그 메시지를 수행하기 위한 객체를 선택하는 것이다.
Ex)
영화를 예매하라 -> 적절한 객체인 Screening 선택
계산하라 -> 적절한 객체인 Movie 선택

협력을 구성하는 객체들의 인터페이스는 충분히 추상적인 동시에 최소한의 크기를 유지할 수 있다.


역할

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

Ex)
비율 할인제와 고정 할인제의 책임은 똑같이 할인 금액을 계산하는 것이다.
그렇다고 해서 비율 할인제와 고정 할인제를 따로 구현하면 코드의 중복이 발생한다.
이 때, '할인 요금을 계산하라'라는 메시지에 응답할 수 있는 대표자를 생각하면 두 협력을 하나로 통합할 수 있다.
이 대표자를 협력 안에서 두 종류의 객체를 교대로 바꿔 끼울 수 있는 일종의 슬롯으로 생각할 수 있다.
이 슬롯이 바로 역할이다.

역할을 구현하는 가장 일반적인 방법 : 추상 클래스와 인터페이스를 사용하는 것

  • 추상 클래스 : 책임의 일부를 구현
  • 인터페이스 : 일체의 구현 없이 책임의 집합만을 나열해 놓음

역할의 가장 큰 장점은 설계의 구성 요소를 추상화할 수 있다는 것이다.
추상화의 이점 : 세부적인 사항으로 인해 객체들 사이의 핵심적인 관계와 관련된 큰 그림을 파악하는 것을 방지한다.

profile
백엔드 개발자

0개의 댓글