관리 메뉴

생각해보기

오브젝트(조영호) 책 정리 -3- 본문

객체지향

오브젝트(조영호) 책 정리 -3-

정한_s 2021. 11. 12. 10:45

객체지향 패러다임 관점의 핵심은 역할, 책임, 협력이다. 객체지향 설계는 협력을 구성하기 위해 적절한 객체를 찾고 적절한 책임을 할당하는 과정이다.

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

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

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

 

영화예매시스템

위 그림처럼 애플리케이션의 제어 흐름은 어떤 하나의 객체에 의해 통제되지 않고 다양한 객체들 사이에 균형 있게 분배된다. 자율적인 객체들은 요청의 흐름에 따라 자신에게 분배된 로직을 실행하면서 애플리케이션의 전체 기능을 완성한다.

 

자율적인 객체란 자신의 상태를 직접 관리하고 스스로 결정에 따라 행동하는 객체이다. 객체의 자율성을 보장하기 위해 필요한 정보와 정보에 기반한 행동을 같은 객체 안에 모아야 한다. 

 

두 객체 사이의 협력은 하나의 객체가 다른 객체에게 도움을 요청할 때 시작된다. 객체는 다른 객체의 직접 접근할 수 없고 오직 메시지 전송을 통해 자신의 요청을 전달할 수 있다. 메시지를 수신한 객체는 메서드를 실행해 요청에 응답한다. 수신 객체는 메시지를 처리하는 방법을 자율적으로 결정한다. 만약에 자신이 할 수 없는 일이라면 다른 적절한 객체에게 위임한다. 

 

객체의 행동을 결정하는 것은 객체가 참여하고 있는 협력이다. 협력이 바뀌면 객체의 행동 역시 바뀌어야 한다. 협력은 객체가 필요한 이유와 객체가 수행하는 행동의 동기를 제공한다. 즉, 협력은 객체를 설계하는 데 필요한 일종의 문맥(context)를 제공한다.

 

행동을 결정하는 것이 협력이라면 상태를 결정하는 것은 행동이다. 객체의 상태는 그 객체가 행동을 수행하는 데 필요한 정보가 무엇인지로 결정된다. 객체는 수행하는 행동과 상태를 가지고 있어야 한다.  

 

객체를 설계하기 위해 필요한 문맥이 갖춰졌다면, 다음은 협력에 필요한 적절한 행동을 수행하는 객체를 찾는 것이다. 이때 협력를 위해 객체가 수행하는 행동은 책임이라 부른다.

 

객체의 책임은 객체가 '무엇을 알고 있는가'와 '무엇을 할 수 있는 가'로 구성된다. 자신이 할 수 있는 책임과 자신이 할 수 없지만 할 수 있는 객체를 아는 책임이 있다.

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

 

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

 

책임 주도 설계 방법의 과정

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

 

책임을 할당할 때 아래의 두 가지 요소를 고려해야 한다. 

  • 메시지가 객체를 결정한다
  • 행동이 상태를 결정한다

 

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

 

  1. 객체가 최소한의 인터페이스를 가질수 있게 된다. 필요한 메시지가 식별될 때까지 객체의 퍼블릭 인터페이스에 어떤 것도 추가하지 않기 때문에 꼭 필요한 퍼블릭 인터페이스를 가질 수 있다
  2. 객체는 충분히 추상적인 인터페이스를 가질 수 있게 된다. 객체의 인터페이스는 무엇을 하는지는 표현해야 하지만 어떻게 수행하는지 노출해서는 안된다. 메시지는 객체가 요청하는 무언가를 의미하기 때문에 메시지를 먼저 식별하면 무엇을 수행할지에 초첨을 맞추는 인터페이스를 얻을 수 있다

 

객체가 존재하는 이유는 협력에 참여하기 위해서이다. 따라서 객체는 협력에 필요한 행동을 제공해야 한다. 객체가 협력에 적합한지를 결정하는 것은 객체의 상태가 아니라 협력이다. 협력이 객체의 행동을 결정하고 행동이 상태를 결정한다. 그리고 그 행동이 바로 객체의 책임이 된다.

 

객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합을 역할이라고 부른다. 따라서 역할로 책임을 추상화 함으로써 여러 개의 비슷한 책임을 하나로 묶을 수 있다. 이는 같은 역할 내 다른 책임들을 교체할 수 있다. 그 결과 역할을 통해 유연하고 변경과 확장에 용이한 설계를 얻을 수 있는 장점이 생긴다. 

 

협력에 적합한 책임을 수행하는 대상이 한 종류라면 간단하게 객체로 간주하고 여러종류의 객체들이 참여할 수 있다면 역할로 부르면 된다. 

 

 

 

Comments