🎯 객체지향의 사실과 오해 3장 정리

💡 타입과 추상화

복잡한 현실을 단순하게 표현하기 위한 핵심 도구, ‘추상화’
그리고 그것을 코드로 녹여내는 ‘타입’


🚇 지하철 노선도와 추상화

지하철 노선도는 현실의 지하철 구조를 정확하게 표현하지 않는다.
대신, 승객이 이동할 때 필요한 정보만 남기고 불필요한 정보는 과감히 버린다.

정확성을 버리고 목적에 집중한 결과물이 바로 추상화의 대표적인 예시다.

“불필요한 것을 도려내고 본질만 남기는 것”
이것이 추상화의 본질이다.


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

사람은 본능적으로 복잡한 현실을 단순화하려는 존재다.
복잡한 현실을 이해하기 쉽게 분해하고 단순화하는 전략이 바로 추상화다.

“진정한 추상화란 현실에서 출발하되,
불필요한 부분을 제거해 본질을 드러내는 과정이다.”

즉, 추상화의 목적은 복잡성의 제거에 있다.
이 과정을 통해 우리는 더 쉽게 이해하고 예측 가능한 모델을 만들 수 있다.


🧩 객체지향과 추상화

1️⃣ 그룹으로 나누어 단순화하기

객체지향에서 명확한 경계를 가진 사물이나 사람객체(Object) 라고 한다.
이 객체들을 공통된 특징을 기준으로 묶어 관리하면, 복잡한 현실을 훨씬 단순하게 표현할 수 있다.


2️⃣ 개념(Concept)

개념이란, 공통점을 기반으로 객체들을 묶기 위한 그릇이다.

예를 들어, ‘사람’이라는 개념은 이름·나이·성별 등의 공통 속성을 가진 객체들의 집합이다.
이때 개별 객체들은 그 개념의 인스턴스(instance) 가 된다.


3️⃣ 개념의 세 가지 관점

구분설명
심볼(Symbol)개념을 가리키는 이름 (예: ‘사람’)
내연(Intension)개념의 정의 (예: 두 발로 걷고 언어를 사용하는 동물)
외연(Extension)개념에 속하는 모든 객체의 집합 (예: 실제 모든 사람들)

즉, 개념은 ‘이름’, ‘정의’, ‘집합’이라는 세 축으로 구성된다.


🧱 타입(Type)

🪞 타입은 개념이다

타입은 결국 공통점을 기반으로 객체를 묶는 개념이다.
즉, 타입과 개념은 본질적으로 동일한 의미를 가진다.


💾 데이터 타입을 통해 본 타입의 특징

  1. 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.
    → 같은 형태라도 사용 방식이 다르면 다른 타입이다.
  2. 타입의 내부 표현은 외부에 감춰진다.
    → 내부 구조보다는 어떻게 동작하느냐가 중요하다.

⚙️ 객체와 타입

객체는 상태(state)행동(behavior) 을 가진다.
하지만 객체지향에서 중요한 것은 데이터가 아닌 행동이다.

  • 상태는 행동의 결과로 변할 수 있지만,
    객체를 구분하는 기준은 “무엇을 할 수 있는가”이다.

객체의 타입은 행동에 의해 결정된다.
즉, 어떤 행동을 할 수 있느냐가 그 객체의 타입을 정의한다.


🧭 행동이 우선이다

  • 다형성(Polymorphism) : 동일한 요청에도 서로 다른 방식으로 응답할 수 있는 능력
  • 캡슐화(Encapsulation) : 데이터는 감추고, 행동만 외부에 공개하는 원칙

즉, 객체지향 설계의 핵심은
“행동을 중심으로 객체를 구분하고, 내부는 숨겨라” 이다.


🧬 타입의 계층 구조

🧩 슈퍼타입과 서브타입

type-hierarchy

예를 들어, 트럼프 인간은 단순한 트럼프가 아니라
트럼프에 인간이라는 특성을 추가한 특수한 타입이다.

  • 일반적인 타입 → 슈퍼타입(Supertype)
  • 더 구체적이고 특수한 타입 → 서브타입(Subtype)

이런 관계를 일반화/특수화 관계 (Generalization / Specialization) 라고 한다.


🧱 정적 모델 vs 동적 모델

🎯 타입의 목적

타입을 사용하는 이유는 시간에 따라 변하는 객체의 복잡성을 줄이기 위해서다.
타입은 객체의 변화를 일시적으로 “정지시켜” 이해할 수 있게 해준다.

즉, 타입은 시간이라는 요소를 제거한 추상화의 도구이다.


⏱️ 동적 모델과 정적 모델

구분설명
동적 모델(Dynamic Model)실제 프로그램 실행 중 객체의 상태 변화와 행동을 시간 흐름 속에서 포착
정적 모델(Static Model)객체가 가질 수 있는 모든 상태와 행동을 시간과 무관하게 표현 (타입 모델)

동적 모델은 “실시간 스냅샷”,
정적 모델은 “청사진(설계도)”에 가깝다.


🧩 클래스(Class)

객체지향 프로그래밍 언어에서는
이 정적인 모델(타입)을 클래스(Class) 로 구현한다.

하지만 중요한 사실은 다음과 같다.

클래스 = 타입이 아니다.

  • 타입(Type) → 객체를 분류하는 개념
  • 클래스(Class) → 타입을 구현하는 하나의 방법

즉, 객체를 구분하는 기준은 클래스가 아니라
그 객체가 수행하는 행동(Behavior) 이다.


📌 정리

핵심 개념요약
추상화불필요한 정보를 제거해 복잡성을 줄이는 것
타입공통 행동을 기준으로 객체를 분류하는 개념
행동 중심 설계객체를 정의할 때 행동을 우선으로 고려
슈퍼타입/서브타입일반화와 특수화의 계층 구조
클래스타입을 구현하는 수단일 뿐, 타입 자체는 아님

결국 “타입은 추상화다.”

객체지향은 복잡한 현실을 단순한 개념으로 추상화하여,
협력 가능한 객체로 모델링하는 예술
이다.