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

Seyeon_CHOI·2022년 10월 31일
0
post-thumbnail

객체지향 패러다임의 관점에서 핵심은 역할, 책임, 협력

객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다.

클래스와 상속은 객체들의 책임과 협력이 어느 정도 자리를 잡은 후에 사용할 수 있는 구현 메커니즘일 뿐이다.



협력

객체지향 시스템은 자율적인 객체들의 공동체이다.
객체는 고립된 존재가 아니라 시스템의 기능이라는 더 큰 목표를 달성하기 위해 다른 객체와 협력하는 사회적인 존재다.

메시지 전송은 객체 사이의 협력을 위해 사용할 수 있는 유일한 커뮤니케이션 수단이다.

오로지 메시지 전송을 통해서만 자신의 요청을 전달할 수 있다.

객체를 자율적으로 만드는 가장 기본적인 방법은 내부 구현을 캡슐화 하는 것이다.


결국, 객체를 자율적인 존재로 만들어야 한다.

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


협력이 존재하기 때문에 객체가 존재하는 것이며, 객체의 행동을 결정하는 것이 협력이라면 객체의 상태를 결정하는 것은 행동이다.


객체의 상태는 객체가 행동을 수행하는 데 필요한 정보가 무엇인지로 결정된다.


결과적으로 객체가 참여하는 협력이 객체를 구성하는 행동과 상태 모두를 결정한다.

따라서, 협력은 객체를 설계하는 데 필요한 일정의 문맥을 제공한다.

책임

협력에 참여하기 위해 객체가 수행하는 행동

객체지향 설계에서 가장 중요한 것은 책임이다. 객체에게 얼마나 적절한 책임을 할당하느냐가 설계의 전체적인 품질을 결정한다.

객체의 책임은 객체가 '무엇을 알고 있는가'와 '무엇을 할 수 있는가'로 구성된다.

하는 것

  • 객체를 생성하거나 계산을 수행하는 등의 스스로 하는 것
  • 다른 객체의 행동을 시작시키는 것
  • 다른 객체의 활동을 제어하고 조절하는 것

아는 것

  • 사적인 정보에 관해 아는 것
  • 관련된 객체에 관해 아는 것
  • 자신이 유도하거나 계산 할 수 있는 것에 관해 아는 것


책임 할당

-> 가장 협력에 필요한 지식과 방법을 가장 잘 알고 있는 객체에게 도움을 요청

객체에게 책임을 할당하기 위해서는 먼저 협력이라는 문맥을 정의해야 한다.

지금까지 본 내용의 요점은 협력을 설계하기 위해서는 책임에 초점을 맞춰야 한다는 것이다.
어떤 책임을 선택하느냐가 전체적인 설계의 방향과 흐름을 결정한다.


책임을 찾고, 책임을 수행할 적절한 객체를 찾아 책임을 할당
-->> 책임 주도 설계

과정

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

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





책임을 할당할 때 고려해야하는 요소

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



메시지가 객체를 선택하게 해야하는 이유

첫번째, 객체가 최소한의 인터페이스를 가질 수 있게 된다.
필요한 메시지가 식별될 때까지 객체의 퍼블릭 인터페이스에 어떤 것도 추가하지 않기 때문

두번째, 객체는 추상적인 인터페이스를 가질 수 있게 된다.
객체의 인터페이스는 무엇을 하는 지는 표현해야 하지만 어떻게 수행하는지를 노출해서는 안된다.


행동이 상태를 결정하는 이유

객체는 협력에 필요한 행동을 제공해야한다.
객체를 객체답게 만드는 것은 객체의 상태가 아니라 객체가 다른 객체에게 제공하는 행동이다.

객체의 내부 구현에 초점을 맞춘 설계 방법을 데이터-주도 설계라고 부르기로 했다.



역할

객체가 어떤 특정한 협력 안에서 수행하는 책임의 집합

  • 유연하고 재사용 가능한 협력

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

  • 객체 대 역할

협력은 역할들의 상호작용으로 구성되고, 협력을 구성하기 위해 역할에 적합한 객체가 선택되며, 객체는 클래스를 이용해 구현되고 생성된다.

  • 역할과 추상화

역할이 공통의 책임을 바탕으로 객체를 숨기기 때문에 추상화 두가지 장점을 가지고있다.

  1. 중요한 정책을 상위 수준에서 단순화
  2. 역할이 다양한 객체의 종류를 끼워넣을 수 있는 슬롯이란 점에서 설계가 좀 더 유연



결국 이 파트에서 가장 핵심은 객체가 수행하는 행동, 즉 책임을 어떻게 잘 할당하느냐가 핵심이다.
어느 정도 자바나 스프링을 활용해 코드를 짜본 개발자들은 무의식적으로 하고 있던 내용들이라고 생각한다.
이 파트는 깊게 생각하고 공부하기보단 중요 부분을 한번 더 리마인드한다는 생각을 가지고 읽으면 좋을 것 같다.

한가지 아쉬운 점은 글로써 이해하기에는 굉장히 어렵다는 것이다. 이론을 설명하다보니 책에선 굉장히 하드하게 글이 작성된 부분이 참 아쉬웠고 만약 이번에 이 글을 읽고 이해하지 못했더라도 본인이 스스로 코드를 짜보고 시행착오를 겪게 된다면 확실히 느낄 수 있는 부분이다.

profile
오물쪼물 코딩생활 ๑•‿•๑

0개의 댓글