[오브젝트] 역할, 책임, 협력

woohobi·2022년 1월 3일
0

Book Review

목록 보기
3/5

3장 역할, 책임, 협력

상속과 합성

2장에서 저자는 객체지향 관점에서 상속보다 합성이 더 나은 선택이라고 하고 있다. 이것은 자명해보이는데, 예를 들어, 2장에서 살펴보았던 Movie를 PercentDiscountMovie와 AmountDiscountMovie로 상속하여 구현한다면 아래와 같다.

Movie avatar = new PercentDiscountMovie("아바타",
	Duration.ofMinutes(100),
	Moeny.wons(10000))
}

하지만, 다른 객체와의 합성을 통해 구현한다면 아래와 같다.

Movie avatar = new Movie("아바타" 
	Duration.ofMinutes(100),
    Moeny.wons(10000)),
    new AmountDiscountPolicy(...));

위의 방법과 아래의 방법의 가장 큰 차이점은 인스턴스를 생성한 뒤, 의존관계 변경 가능의 여부이다. 아래 합성을 사용하였을때는 런타임 환경에서 의존성을 쉽게 변경할 수 있다. 즉, 상속보다 약한 의존성을 가진다. 이에 비해, 위의 방법은 의존관계를 새롭게 맺기 위해서는 instance를 새로 만들어야 한다. 따라서, 상속보다 합성이 객체지향관점에서 더 나은 설계이다.

public void changeDiscountPolicy(DiscountPolicy discountPolicy){
	this.discountPolicy = discountPolicy;
}

역할, 책임, 협력

객체지향의 설계 핵심은 클래스, 상속이 아닌 역할, 책임, 협력이다. 클래스와 상속은 객체지향을 구현하는 도구이다.

협력

두 객체 사이의 협력은 메세지 전송으로 이루어진다. 객체지향 관점에서 다른 객체의 상태를 변경은 강한 의존성을 만들기 때문에, 유일한 방법은 메세지 전송을 통한 협력이다. 메세지 전송을 통해 적절한 역할을 가진 다른 객체에게 책임을 위임해야한다. 따라서, 협력은 객체의 행동을 결정하고, 객체의 행동이 객체의 상태를 결정한다 (협력 -> 객체 행동 -> 객체 상태)

책임

객체는 협력을 하기 위해 행동을 수행할 수 있는 책임을 가진 객체를 찾는다. 책임은 객체의 상태의 책임과 행동의 책임 두 가지로 나뉜다.

책임 할당이란? : 책임 할당은 협력을 시작하기 위한 메세지에서부터 시작한다. 메세지를 수행할 수 있는 적절한 역할을 가진 객체를 찾는 과정을 책임 할당이라고 한다. 책임 할당에서 중요힌 것은 객체가 메세지를 선택하는 것이 아닌, 메세지가 필요한 객체를 선택하는 것이다.

역할

책임을 할당할때는 알맞은 역할을 가진 객체에게 할당하는 것이 중요하다고 앞에서 살펴보았다. 객체 가 아닌 역할에 책임을 할당함으로써 유연하고 확장성 있는 설계를 달성할 수 있다. 구현에서 역할은 interface와 abstract class, 객체는 class를 통해 구현한다. 다만, 한 종류의 객체만이 협력에 참여할 수 있다면(다른 객체가 협력에 참여할 수 있는 가능성이 없다면) 역할과 객체를 동일하게 생각해도 된다.

역할과 추상화

알맞는 행동에 필요한 역할을 찾기 위해서 객체를 추상화해서 상위 수준에서 협력을 결정하는 것이 역할을 찾는데 더 명확하다. 왜냐하면 "Movie 할인정책을 찾기위해 할인 정책을 참조하여야 한다." 가 할인정책을 찾기위해 PercentDiscountPolicy와 AmountDiscountPolicy를 참조하여야한다 보다 단순하고 명확하기 때문이다.

이번 장에서는 앞서 살펴보았던 2장에서 쓰였던 개념을 자세하게 알아보았다.

profile
CDD - Coffee Driven Development

0개의 댓글