Skip to content

Commit

Permalink
Docs: Object-oriented_Facts_and_Misunderstandings/Chapter03.md
Browse files Browse the repository at this point in the history
  • Loading branch information
fkdl0048 committed Dec 22, 2023
1 parent 76080c1 commit 2e42271
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions Object-oriented_Facts_and_Misunderstandings/Chapter03.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
## 3장 타입과 추상화

> 일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조직하고, 추론하는 것에 관한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다.
>
> - 키스 데블린
영국 지하철 사례로 이야기를 시작하는데 책과 관련은 없지만 개발자가 꼭 알아야 하는 사례와 같은 [계획 오류](https://fkdl0048.github.io/daily/GamePM/#planning-fallacy%EA%B3%84%ED%9A%8D-%EC%98%A4%EB%A5%98)라는 개념이 있다.

누구나 경험해봤을 이야기지만 책에 잘 정리된 내용이 있어서 첨부한다.

**지하철 노선도 디자인에서 가장 중요한 것은 얼마나 사실적으로 지형을 묘사했느냐가 아니라 역과 역 사이의 연결성을 얼마나 직관적으로 표현했느냐다**.

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

현실은 매우 복잡하며 예측 불가능한 혼돈 덩어리다.

현실에 존재하는 다양한 현상 및 사물과 상호작용하기 위해서는 우선 현실을 이해해야 한다.

문제는 복잡성의 총제인 현실이라는 괴물을 그대로 수용하기에는 인간이 지니고 있는 능력과 저장 공간이 너무나도 보잘것없다는 점이다.

**따라서 사람들은 본능적으로 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화하는 전략을 따른다.**

따라서 진정한 의미에서 추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다.

추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다.

*좀 더 단순하게 본다는 점에서 코페르니쿠스와 같은 개념을 가진다.*

> "현상은 복잡하다. 법칙은 단순하다. 버릴 게 무엇인지 알아내라."
>
> - 리처드 파인만
따라서 추상화는 다음과 같다.

- 추상화
- 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
- 복잡성을 다루기 위해 추상화는 두 차원에서 이뤄진다.
- 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화하는 것이다.
- 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순화하는 것이다.
- 모든 경우에 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 명심해라

객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다.

그리고 객체지향 패러다임을 이용해 유용하고 아름다운 애플리케이션을 개발하기 위한 첫걸음은 추상화의 두 차원을 올바르게 이해하고 적용하는 것이다.

### 객체지향과 추상화

#### 모두 트럼프일 뿐

> "기껏해야 트럼프에 불과해. 무서워할 필요 없어"
정원사, 클로버 병사들 모두 객체이지만 앨리스는 이를 하나로 아울러 생각하고 있다.

앨리스는 객체들 중에서 하얀 토끼를 제외하고 모든 객체를 '트럼프'라는 하나의 개념으로 단순화해서 바라보고 있다.

그들의 나이, 계급, 성격을 무시한 채 트럼프라는 유사성을 기반으로 추상화하여 바라보고 있는 것이다.

#### 그룹으로 나누어 단순화하기

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서 객체라고 한다.

앨리스 이야기에서 다양한 인물들을 '트럼프'라는 한 단어로 줄여 지칭할 수 있는 이유는 '트럼프'라고 했을 때 떠오르는 일반적인 외형과 행동 방식을 지니고 있기 때문이다.

결과적으로 앨리스는 정원에 있는 인물들을 두 개의 그룹으로 나눠서 바라본다.

트럼프 그룹과 하얀 토끼 그룹으로 나누어서 바라보고 있다.

이 이야기에서 토끼는 하나로 존재하지만 다수의 개별적인 인물이 아닌 그룹을 통해 정원을 바라보기 때문에 정원에 내재된 복잡성을 효과적으로 감소시킨다.

*앨리스뿐만 아니라 우리도 그러하다. 지나가는 사람의 모든 정보를 해석하지 않고 사람으로 추상화하기 때문이다.*

#### 개념

앨리스는 인물들의 차이점을 의도적으로 무시하고 공통점만을 강조함으로써 '트럼프'라는 그룹에 속할 수 있는 인물들을 취사선택한 것이다.

앨리스가 인물들의 차이점을 무시하고 공통점만을 취해 트럼프라는 개념으로 단순화한 것은 추상화의 일종이다.

객체지향 패러다임의 중심에는 구체적이고 실제적인 객체가 존재하지만 수많은 객체들을 개별적인 단위로 취급하기에는 인간이 지닌 인지능력은 턱없이 부족하다. (본능적인 추상화를 한다.)

이처럼 공통점을 기반으로 객체들을 묶기 위한 그릇을 **개념**이라고 한다. (관념이나 아이디어)

개념을 이용하면 객체를 여러 그룹으로 **분류**할 수 있다.

결과적으로 개념은 공통점을 기반으로 객체를 분류할 수 있는 일종의 체라고 할 수 있다.

결국 각 객체는 특정한 개념을 표현하는 그룹의 일원으로 포함된다.

하트 여왕은 트럼프라는 개념 그룹의 일원이고 하얀 토끼는 토끼라는 개념 그룹의 일원이다.

이처럼 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 **인스턴스**라고 한다.

개념은 세상의 객체들을 거르는 데 사용하는 정신적인 렌즈를 제공한다.

이 렌즈를 통해 세상을 바라보면 수백 수천 개의 다양한 객체가 존재하는 복잡한 세상을 몇 개의 개념만으로 단순화할 수 있다.

#### 개념의 세 가지 관점

개념은 특정한 객체가 어떤 그룹에 속할 것인지를 결정한다. (어떤 개념의 인스턴스인지를 결정한다.)

일반적으로 객체의 분류 장치로서 개념을 이야기할 때는 아래의 세 가지 관점을 함께 언급한다.

- 심볼(symbol): 개념을 가리키는 간략한 이름이나 명칭
- 내연(intension): 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있다.
- 외연(extension): 개념에 속하는 모든 객체의 집합

먼저 심볼이란 앨리스 이야기에서 '트럼프'에 해당된다.

'내연'이란 개념의 의미를 나타낸다. 앨리스 이야기에선 몸이 납작하고, 두 손과 발이 네모난 몸 모서리에 달려 있는지 여부를 판단하기 위한 조건이라는 점에 주목하자.

마지막으로 '외연'은 개념에 속하는 객체들, 즉 개념의 인스턴스들이 모여 이뤄낸 집합을 가리킨다.

개념을 이용해 공통점을 가진 객체들을 분류할 수 있다는 아이디어는 객체지향 패러다임이 복잡성을 극복하는 데 사용하는 가장 기본적인 인지 수단이다.

#### 객체를 분류하기 위한 틀

어떤 객체와 마주했을 때 객체에게 적용할 개념을 결정하는 것은 결국 해당 객체를 개념이 적용된 객체 집합의 일원으로 맞아들인다는 것을 의미한다.

어떤 객체가 개념에 적합하지 않을 경우 해당 객체는 해당 개념의 객체 집합에 포함되지 않을 것이다.

> 분류란 객체에 특정한 개념을 적용하는 작업이다. 객체에 특정한 개념을 적용하기로 결심했을 때 우리는 그 객체를 특정한 집합의 멤버로 분류하고 있는 것이다.
분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다.

객체를 적절한 개념에 따라 분류하지 못한 애플리케이션은 유지보수가 어렵고 변화에 쉽게 대처하지 못한다.

반면에 객체를 적절한 개념에 따라 분류한 애플리케이션은 유지보수가 용이하고 변경에 유연하게 대처할 수 있다.

**더 중요한 것은 절절한 분류 체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 정신적 지도를 제공한다는 점이다.**

#### 분류는 추상화를 위한 도구다

개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다.

그리고 오늘을 살아가는 우리는 매 순간 세상에 존재하는 무수한 사물들을 개념의 틀로 걸러가며 세상을 추상화한다.

추상화를 사용함으로써 우리는 극도로 복잡한 이 세상을 그나마 제어 가능한 수준으로 단순화할 수 있는 것이다.

### 타입

0 comments on commit 2e42271

Please sign in to comment.