- 부록A읽기 → 소챕터별로 나눠서 발표


분류와 인스턴스화
개념과 범주
승용차, 버스, 트럭 ⇒ 자동차 길거리의 다양한 종류의 가로수 ⇒ 나무
- 객체를 분류하고 범주로 묶는것은 특정 집합에 공통의 개념을 적용하는것을 의미함
- 범주로 묶음으로써 복잡성을 낮출 수 있음
- 어떤 객체가 타입의 정의에 부합 → 해당 타입으로 분류 → 타입의 인스턴스가 됨
타입
어떤 객체의 타입을 자동차라고 말할 수 있으려면 자동차에 대한 명확한 정의가 필요
- 내연: 타입의 정의 ex) 원동기의 힘을 이용해 ~~ 운반하는 기계
- 외연: 타입에 속하는 객체들의 집합 ex) 승용차, 버스, 트럭 묶음
- 심볼: 타입을 가리키는 이름이나 명칭 ex) 자동차
외연과 집합
- 단일 분류: 한 객체가 한 시점에 하나의 타입에만 속하는 것
- 다중 분류: 한 객체가 한 시점에 여러 타입에 속할 경우
객체 지향 프로그래밍 언어들은 단일 분류만을 지원
→ 한 객체는 오직 한 클래스의 인스턴스여야만 한다. 두 개의 클래스의 인스턴스 X
- 동적 분류: 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경 가능
- 정적 분류: 객체가 자신의 타입을 변경할 수 없는 경우
다중 분류 + 동적 분류를 적용하는 것은 실세계 복잡성 모델링에 유용
but, 대부분의 언어는 클래스를 변경할 수 있는 방법을 제공하지 않음. 구현에 쉽지 않음
→ 디자인 패턴이 해당 방식을 적용한 것. 반드시 필요한 경우에만 사용
마틴파울러의 디자인 템플릿
다중 분류 + 동적 분류 관점에서 도메인 모델의 초안을 만든 후
단일 분류 + 정적 분류 방식으로 객체들의 범주를 재조정하자!
클래스
객체지향언어에서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것
동일한 범주에 속하는 객체는 동일한 클래스의 인스턴스여야함
동일란 범주에 속하는 객체는 모두 동일한 속성을 가지여만 한다.
일반화와 특수화
범주의 계층 / 서브타입 / 상속
범주의 계층
아리스토텔레스 - 동물의 발생
이전까지의 분류기법


린네의 분류
근대적인 분류기법

서브타입
객체지향 세계에서, 범주 = 개념 = 타입
어떤 타입이 다른 타입보다 일반적이라면슈퍼타입
이라고 한다
어떤 타입이 다른 타입보다 좀 더 특수하다면 이 타입을서브타입
이라고 한다
슈퍼타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화이다.
파편화된 사실을 모르더라도 복잡한 세상의 속성을 논리적으로 쉽게 이해할 수 있다.
- 내연의 관점에서 일반화와 특수화는 → 범주간의 논리적인 추론을 가능하게 한다
- 일반화의 특징을 이용하면 부분적인 사실을 통해 → 복잡한 사실에 대한 논리적인 추론이 가능
상속
일반화와 특수화 관계를 구현하는 가장 일반적인 방법 ⇒ 상속!
일반화의 원칙은 한 타입이 다른 타입의 서브타입이 되기 위해 슈퍼타입에 순응해야 한다.
순응
특정 기대 집합에 대해 서브타입의 슈퍼타입에 대한 대체가능성을 의미
- 구조적인 순응
- 속성과 연관관계에 관한 것
- 행위적인 순응
- 동일한 계약을 기반으로 하느냐에 관한 것
- 흔히
리스코프 치환원칙
이라고 함
상속의 용도
- 서브타이핑(subtyping)
- 서브클래스가 슈퍼클래스를 대체할 수 있는 경우
- 설계의 유연성이 목표
- 인터페이스 상속
- 서브클래싱(subclassing)
- 서브클래스가 슈퍼클래스를 대체할 수 없는 경우
- 코드의 중복 제거와 재사용
- 구현 상속
모든 상속이 서브 타이핑이 아님
위임
여러 클래스로 구성된 상속 계층에서 수신된 메시지를 이해하는 기본적인 방법
계층내 어떤 클래스가 메시지를 처리하거나 최상위 부모 클래스에 위임될 때까지 계속됨
집합과 분해
계층적인 복잡성
- 복잡성은 계층의 형태를 띈다.
- 단순한 형태로부터 복잡한 형태로 진화하는 데 걸리는 시간은 그 사이에 존재하는 안정적인 형태의 수와 분포에 의존한다.

- 안정적인 형태의 부분으로부터 전체를 구축하는 행위를 집합이라 한다.
- 반대로 전제를 부분으로 분할하는 행위를 분해라고 한다.
- 이러한 방식으로 집합을 이루어 생성된 계층 구조는 재귀적인 설계를 가능하게 한다.
재귀적인 설계란 무엇을 말하는 것일까?
- 집합은 전체의 내부로 불필요한 세부 사항을 감춰주기 때문에 추상화 메커니즘인 동시에 캡슐화 메커니즘이다.
- 집합은 한 번에 다뤄야 하는 요소의 수를 감소시킴으로써 인지 과부화를 방지한다.
합성관계
- 객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성관계를 사용한다.
- 부분을 전체안에 캡슐화 하여 인지 과부화 방지
- 주문, 주문항목, 상품이 있다면 주문 안에 주문 항목의 존재를 일시적으로 감춰 복잡성을 낮춘다.
- 연관관계 : 주문 항목과 상품 간에 관계
- 상품은 주문 항목의 일부가 아니다.
- 합성관계는 연관관계보다 객체를 더 강하게 결합한다.
- 합성 관계는 포함하는 객체가 제거될 때 내부에 포함된 객체도 함께 삭제
- 연관 관계는 독립적으로 제거
패키지
- 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소 (모듈, 패키지)
- 패키지는 내부에 포함된 클래스들을 감춤으로써 시스템의 구조를 추상화한다.