# CH03 타입과 추상화

### 추상화를 통한 복잡성 극복

저자는 인간의 부족한 인지능력에 비해 현실 세계의 복잡도는 너무 크기 때문에 인간은 본능적으로 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화 한다고 한다.

이 과정에서 추상화가 발생하는데, 불필요한 부분을 도려내가면서 사물의 본질을 드러내게 하는 과정이라는 인용을 사용하고 있다.

잘된 추상화의 예시로 해리 벡의 지하철 노선도를 들고 있는데 매우 적절한 비유라고 생각했다.

<figure><img src="https://1889038796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQ0ynUCwOcYxaUYkg5rP6%2Fuploads%2FYXBNu8xAd438herWWVod%2Fimage.png?alt=media&#x26;token=c4070baf-0fda-4ea6-bd12-1ea51ce65ec8" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1889038796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQ0ynUCwOcYxaUYkg5rP6%2Fuploads%2FNoKx3beyC1YbIjNHTm6o%2Fimage.png?alt=media&#x26;token=eba7cb57-5af3-40a9-8de4-4add46d40302" alt=""><figcaption></figcaption></figure>

지하철 노선도의 목적은 현재 위치와 목적지, 경유역 등을 확인하는 용도인데 이를 위해서 굳이 사실적으로 구불구불한 노선을 보여줄 필요는 없다. 그래서 해리 벡이 위 노선도중 아래 노선도처럼 추상화했다고 한다.

책에서는 추상화를 아래와 같이 정의한다.

{% hint style="info" %}
추상화

어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.

추상화는 아래 두 차원에서 이뤄진다.

1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화
2. 중요한 부분을 강조하기 위해서 불필요한 세부 사항을 제거
   {% endhint %}

### 개념과 분류

책에서 '개념'에 대해서 설명하고 있는데, 내용이 제법 긴 반면에 생각보다 정리할 필요성은 못느껴서 넘어갔다. 요약하자면 책에서 소개하는 '개념' 이란 공통적인 특성을 기준으로 객체를 그룹으로 묶을 수 있는 단위이다. 분류의 단위인 것이다.

객체지향에서 분류는 매우 중요한 행위이다. 객체를 적절하게 분류하여 설계할 수록 유지보수가 용이하고 변경에 유연할 수 있으며 개발자가 객체를 쉽게 찾고 조작할 수 있는 정신적인 지도를 제공할 수 있다.

### 분류를 위해서는 행동을 봐야한다

객체의 타입(개념)을 정할때 그 기준이 되는 것은 객체의 행동이다. 상태가 아니라 행동이다. 동일한 데이터를 가지고 있더라도 다른 행동을 한다면 같은 분류에 넣을 수 없다.

반대로 같은 행동을 한다면 서로 다른 상태를 지닐 수 있다. 이미 앞서 객체를 설계할 때 가장 먼저 고민하고 우선해야할 것이 바로 객체가 어떤 행동을 하는지에 대한 고민인 것을 알아보았다.

중요한 부분이니까 이유를 다시 언급하자면 결국 객체지향의 관점에서 소프트웨어를 설계한다는 것은 객체간의 협력을 어떻게 잘 발생하게 할지 최적의 형태를 고민하는 것이고 이는 각 객체들에게 어떤 책임을 각각 할당하게 할지를 고민하는 것과 같은 것이었다. 객체는 결국 책임을 다하기 위해서 각자 행동을 취할 것이기 때문에 행동은 객체를 결정하고 분류하는 가장 중요한 기준이 된다.

{% hint style="info" %}
객체가 외부에 제공해야 하는 책임을 먼저 결정하고 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는데 필요한 외부 인터페이스 뒤로 캡슐화 해야 한다.
{% endhint %}

### 일반화와 특수화

<figure><img src="https://1889038796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQ0ynUCwOcYxaUYkg5rP6%2Fuploads%2FCGYFQJQcXW9Z7H07L7I8%2F2023.%204.%205.%20-%200.jpg?alt=media&#x26;token=29455b6f-c848-4b25-8a55-dcd0705d9c22" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1889038796-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQ0ynUCwOcYxaUYkg5rP6%2Fuploads%2FGumBShnRAoLPUIo1sHtM%2Fimage.png?alt=media&#x26;token=c99520dc-00ce-4e44-b960-02f3e464de43" alt=""><figcaption></figcaption></figure>

특별한 것은 아니고 일반적으로 늘 해오던 상속 및 구현에 관한 이야기이다. 예시가 참신해서 따로 노트로 남긴다.
