역할, 협력, 책임 (작성중)

김민우·2024년 1월 10일
0

오브젝트 스터디

목록 보기
3/13

객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 클래스, 상속, 동적 바인딩은 객체의 책임과 협력이 정해진 후 사용 가능한 구현 매커니즘이다.

초반 설계시 구현에 초점을 두어선 안된다. 어떤 협력이 필요하지? 여기에 어떤 역할과 책임이 필요하지? 를 고민하고 얼추 정해진 후 구현을 해야한다.

협력


기능을 구현하기 위해 객체끼리 상호작용을 하는 걸 협력(Collaboration)라 한다. 하나의 객체가 다른 객체에게 도움을 요청(메시지를 전송)하는 순간 협력은 시작된다.

협력은 객체를 설계할 때 필요한 일종의 문맥(Context)를 제공한다. 필요한 협력에 따라 객체의 행동이 결정된다.

자율적인 객체

메시지를 수신한 객체는 자신의 메서드를 통해 응답할 수 있다. 이처럼 객체는 자신의 일을 스스로 처리하는 자율적 존재임을 다시 한 번 알 수 있다.

e.g. movie.caculateMovieFee(screening)

  • Screening 은 요금 계산을 movie에 위임 (movie가 이에 필요한 기본 요금, 할인 정책을 잘 알고 있으므로)
  • 만약, Screening이 직접 요금 계산을 한다면 어떨까?
    • Movie 내부에 직접 접근하므로 캡슐화가 이뤄지지 않는다.
    • 추가로, Movie의 자율성이 훼손되어 수동적 객체가 된다.

내부 구현을 캡슐화하여 자신의 상태를 스스로 관리하는 객체를 뜻한다. 이는 변경에 대한 파급효과를 제한함으로써 변경에 유연하게 대처가 가능해진다.

만약, 자신에게 할당된 책임을 수행하는 중 필요한 정보가 부족하다면 적절한 객체에게 협력을 요청(메시지를 전송)할 수 있다.

이처럼 객체를 만드는 이유는 그 객체가 어떤 협력에 참여하기 때문이고, 객체가 협력에 참여할 수 있는 이유는 이에 필요한 적절한 행동을 가지고 있기 때문이다.

상태와 행동

이처럼 객체의 행동을 결정하는 것은 협력이다. 이는 협력이 바뀐다면 객체의 행동도 바뀐다는 것을 의미한다.

그렇다면 객체의 상태는 어떻게 결정될까? 이는 행동에 의해 결정된다. Movie 객체가 요금 계산이라는 행동을 수행하기 위해선 뭐가 필요할까?

Movie.java
업로드중..

기본적으로 요금, 할인 정책을 알고 있어야 한다. 따라서, MovieMoney, DiscountPolicy라는 상태를 포함한다. 이처럼 상태는 객체가 행동하는데 필요한 정보에 의해 결정된다.

책임


협력이 갖춰졌다면 이에 필요한 행동을 수행할 수 있는 객체를 찾아야 한다. 이러한 협력에 참여하기 위해 객체가 수행하는 행동을 책임이라 한다.

협력이 중요한 이유는 객체에게 할당할 책임에 대한 문맥을 제공하기 때문이다. 설계 중 가장 중요한 것은 바로 책임이다.

책임의 종류

객체의 책임은 크게 2가지로 나뉜다.

  • 아는 것(knowing)
  • 하는 것(doing)

이 둘은 객체에게 책임을 할당하기 위한 힌트를 제공한다.

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

  • 하는 것 : 영화 예매
  • 아는 것 : 자신이 상영할 영화(Movie)

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

  • 하는 것 : 예매 가격 계산
  • 아는 것 : 영화 가격(fee), 할인 정책(DiscountPolicy)

일반적으로 책임과 메시지의 크기는 다르다. 하나의 객체가 수행할 수 있다고 생각했던 책임이 나중엔 여러 객체들이 협력해야하는 커다란 책임이 된다.

책임 할당

자율적인 객체를 만드는 가장 기본적인 방법은 이에 필요한 정보를 가장 잘 아는 객체에게 책임을 할당하는 것이다. 이를 정보 정문가 패턴(information expert pattern)이라 한다.

e.g. 영화 예매 시스템을 정보 전문가에게 책임 할당

  1. 메시지

0개의 댓글