오브젝트 - 역할, 책임, 협력

오브젝트

본 게시글은 오브젝트를 읽고 블로그 포스팅자가 정리한 글임을 밝힙니다

 

 

 

역할, 책임, 협력


객체지향의 핵심은 역할, 책임, 협력이다. 역할, 책임 협력이 제자리를 찾지 못한 상태라면 변경하기 어렵고 유연하지 못한 코드를 낳는 원인이 된다. 

 

1) 협력(collaboration)

객체들이 애플리케이션의 기능을 구현하기 위해 수행하는 상호작용을 협력이라고 한다. 두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청 할 때 시작된다.

 

 

상영과 영화의 협력을 나타낸 것이며 상영은 영화에게 요금 계산 작업 메세지를 전송함으로써 요금 계산을 요청한다.  

상영이 영화에게 처리를 요청한 이유는 요금과 할인 정책을 가장 잘 알고 있는 객체가 영화이기 때문이다.

 

만약, 상영 객체에서 요금을 계산하는 작업을 직접 구현한다고 하면 영화의 요금과 할인정책에 직접 접근을 해야된다. 이 경우 상영은 영화의 내부 구현에 결합된다. 

 

이처럼 직접 처리할 수 없는 정보나 행동이 필요한 경우 메세지를 전송해 협력을 요청한다.

 

2) 책임(responsibility)

책임이란 객체에 의해 정의되는 응집도 있는 행위의 집합이며, 객체의 책임은 '아는 것' 과 '하는 것'로 구성된다.

크레이그 라만은  '하는 것' 과 '아는 것'을 다음과 같이 세분화하였다.

 

'하는 것'

- 객체를 생성하거나 계산을 수행하는 것

- 다른 객체의 행동을 시작 하는 것 

- 다른 객체의 활동을 제어하고 조절하는 것

 

'아는 것'

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

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

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

 

아래는 책임에 대한 예시이다. 

 

[상영의 책임] 

- 상영 정보를 알고 있다.

- 예매 정보를 생성한다.

 

[영화의 책임]

- 영화 정보를 알고 있다.

- 가격을 계산한다.

 

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

 

"객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것" - 크레이그 라만

 

 

3) 역할(role)

객체의 목적은 협력 안에서 객체가 맡게 되는 책임의 집합으로 표시된다. 이처럼 객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 한다.

 

책임 할당 과정 전 '요금 계산 작업'을 수행할 적절한 역할이 무엇인가를 찾고 이 역할을 수행할 객체로 '영화'을 선택한 것이다.  

 

[적합한 역할을 선택하지 못한 경우] 

 

그림과 같이 '금액 할인 정책''비율 할인 정책'이라는 두 종류의 객체가 참여하는 협력을 개별적으로 구현하면 대부분의 코드가 중복될 것이다. 

 

[적합한 역할을 선택한 경우]

그림과 같이 '금액 할인 정책''비율 할인 정책' 을 포괄하는 대표자 '할인정책' 역할을 생성했다. 이를 통해 불필요한 중복 코드를 제거할 수 있다. (역할을 구현하는 가장 일반적인 방법은 추상 클래스와 인터페이스를 사용하는 것이다.)

 

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

Tags

Read Next