# 1장. 협력하는 객체들의 공동체

객체지향과 실세계는 일 대 일로 정확히 매칭 되는 구조가 아니다.&#x20;

그럼에도 불구하고 실세계와 비유하는 이유는 인간이 이해하기 가장 쉬운 개념인 **"언어" 체계 기반의 추상화 개념**이 적용 되어 이해를 돕기 때문에 학습을 위해 실세계와 매칭 하게 된 것이다.

### \[ 협력 하는 사람들 ]

<figure><img src="https://2866575076-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVJhVCjGzSpinr6v1FHUo%2Fuploads%2Fu192mvLMBEQ3KVKbpUZU%2Fimage.png?alt=media&#x26;token=29c7b4d9-0214-4f68-b2dc-9fc4fc8e4ff8" alt=""><figcaption></figcaption></figure>

문제를 해결 하는 프로세스에서 각 객체 간 **역할, 책임, 협력**을 통해 문제를 해결한다. 위 그림에서 볼 수 있는 역할 관계는 아래 내용과 같다.

* 캐시어: 주문을 받아야한다.
* 바리스타: 커피를 제조해야한다.
* 손님: 캐시어에게 커피 메뉴를 주문 해야한다.

<figure><img src="https://2866575076-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVJhVCjGzSpinr6v1FHUo%2Fuploads%2FbAqtbgkRNUQz154NwScn%2Fimage.png?alt=media&#x26;token=34430e70-bab6-4611-9b8d-d090d3e20d60" alt=""><figcaption></figcaption></figure>

### \[ 역할, 책임, 협력 ]

위에서 실세계와 비유 하여 객체지향의 포괄적인 의미를 이해 하는데 힌트를 얻었다. 앞으로 객체지향을 프로그래밍의 문맥으로 옮기면 아래와 같다.

* 사람 -> 객체
* 요청 -> 메시지
* 요청을 처리 하는 방법 -> 메소드

인간은 목표를 달성하기 위해 협력 하지만, 객체는 어플리케이션의 기능을 구현 하기 위해 협력 한다. 그래서, 애플리케이션의 디자인을 아름답게 만들기 위해서 **객체에게 얼마나 적절한 책임을 부여**하는가를 중요하게 여겨야 한다.

### \[ 협력 속에 사는 객체 ]

**협력**&#x20;

객체는 언제나 열린 마음으로 다른 객체에게 적극적으로 도움을 요청할 줄 알야야한다.&#x20;

만약, 외부의 도움을 모두 무시한 채 스스로 전부 구현한 전지전능한 객체를 설계 했다면 나중에 복잡도로 인해 스스로 자멸하게 될 것이다.

**자율**

객체는 자기 스스로 어떠한 원칙에 따라 행동 하고 스스로를 통제 하는 자율성이 필요하다.

스스로 행동하고 통제 하기 위해서 **상태**와 **행동**을 객체 스스로 지니고 있어야 한다. 이러한 자율성은 객체의 내부세계와 외부 세계를 철저히 분리 했을 때 나타난다.

객체의 외부 세계에서는 접근이 허락 된 메서드를 통해 의사소통 해야 하며, **무엇을 수행하는지 알 수 있지만 어떻게 수행 하는지는 알 수 없다.**

이처럼 외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 "메서드"를 분리하는 것이 객체의 자율성을 높이는 매커니즘이다.

💡 따라서, 객체는 상태와 행위를 하나로 묶는 자율적인 존재이다.

### \[ 객체 지향의 본질 ]

훌륭한 객체 지향을 설계 하기 위해 거쳐야 할 것은 **코드를 담는 클래스의 관점에서 메시지를 주고 받는 객체의 관점으로 사고를 전환 하는 것**이 필요하다.

객체가 갖고 있는 속성 값에 직접 접근 하지 말자. 우리는 객체를 훨씬 더 존중해야한다.

{% hint style="info" %}
**객체 존중하기**

* 객체의 속성 값이 필요하다면 객체에게 요청하라.
* 객체의 역할에 맞는 책임이 따른 행동이 필요하다면 열린 마음으로 요청하라.
* 절대 폭력적으로 객체의 주머니 속에 손을 넣지 말아라.
  {% endhint %}
