
부록A: 추상화 기법
추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용할 수 있는 가장 기본적인 인지 수단이다.

분류는 객체의 구체적인 세부 사항을 숨기고 인스턴스 간에 공유하는 공통적인 특성을 기반으로 범주를 형성하는 과정이다.
객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미한다.
인스턴스화(예시)는 분류의 반대 과정으로, 범주로부터 객체를 생성한다.
타입은 심볼(명칭), 내연(정의), 외연(타입에 속하는 객체 집합) 측면에서 나타낼 수 있는 개념이다.
집합은 외연을 가리키는 또 다른 명칭이다. 객체들은 동시에 서로 다른 집합에 포함될 수 있다.
각 집합은 내연의 정의를 만족하는 객체를 원소로 포함한다.
한 객체가 한 시점에 하나의 타입에만 속하면 단일 분류(single classification), 여러 타입에 속하면 다중 분류(multiple classification)라고 한다.
객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있는 경우 동적 분류(dynamic classification), 객체가 자신의 타입을 변경할 수 없는 경우 정적 분류(static classification)라고 한다.
객체지향 프로그래밍 언어를 이용해 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다.
클래스는 타입 구현 외에도 코드를 재사용하는 용도로 사용할 수 있다.
동일한 범주에 속하는 객체는 동일한 클래스의 인스턴스이며, 모두 동일한 속성을 가져야 한다.
상위 계층 범주를 하위 계층 범주의 일반화라고 하고, 하위 계층 범주는 상위 계층 범주의 특수화라고 한다.
일반화는 범주 사이의 차이를 숨기고 범주 간에 공유하는 공통적인 특성을 강조한다.
어떤 타입이 다른 타입보다 일반적이면 슈퍼 타입(supertype), 어떤 타입이 다른 타입보다 조금 더 특수하다면 서브 타입(subtype)이라고 한다.
슈퍼타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화다.
서브타입은 슈퍼타입의 본질적인 속성을 모두 포함하기 때문에 계층에 속하는 모든 서브타입들이 슈퍼타입의 속성을 공유한다.
어떤 타입이 다른 타입의 서브타입이 되기 위해서는 '100% 규칙'과 'is-a 규칙'을 준수해야 한다.
100% 규칙은 슈퍼타입의 정의가 100% 서브타입에 적용되어야 하며, 서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야 한다는 것이다.
is-a 규칙은 'subtype is a supertype'으로, 서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함되어야 한다는 것이다.
두 클래스 간에 상속 관계가 존재할 때, 이 관계를 반드시 일반화 관계라고 할 수는 없다.
한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응(conformance)해야 한다. 순응에는 타입의 내연과 관련된 구조적인 순응과 타입 행위와 관련된 행위적인 순응이 있다.
상속은 서브타이핑과 서브클래싱 두 가지 용도로 사용될 수 있다. 서브클래스가 슈퍼클래스를 대체할 수 있으면 서브타이핑(subtyping), 슈퍼클래스를 대체할 수 없다면 서브클래싱(subclassing)이라고 한다. 흔히 서브타이핑을 인터페이스 상속(interface inheritance), 서브클래싱을 구현 상속(implementation inheritance)이라고 한다.
여러 클래스로 구성된 상속 계층에서 수신된 메시지를 이해하는 기본적인 방법은 클래스 간의 위임(delegation)을 사용하는 것이다. 어떤 객체의 클래스가 수신된 메시지를 이해할 수 없다면, 메시지를 클래스의 부모 클래스로 위임한다.
부분으로부터 전체를 구축하는 행위를 집합이라고 하고, 집합과 반대로 전체를 부분으로 분할하는 행위를 분해라고 한다.
집합은 전체의 내부로 불필요한 세부 사항을 감춰주기 때문에 추상화 메커니즘인 동시에 캡슐화 메커니즘이다.
주문과 주문 내역은 독립적으로 존재할 수 없다. 주문 내역은 반드시 어떤 한 주문의 일부로 생성되기 때문에 주문의 일부여야 한다. 이러한 객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성 관계를 사용한다.
합성 관계는 부분을 전체 안에 캡슐화한다.
상품과 주문 내역 사이에도 관계가 존재하지만 상품은 주문 내역의 일부는 아니다. 이러한 관계는 연관 관계라고 한다.
합성 관계로 연결된 객체는 객체가 제거될 때 내부에 포함된 객체도 함께 제거된다. 반면 연관 관계로 연결된 두 객체는 생명주기와 관련된 어떤 제약도 부과하지 않는다.
소프트웨어의 전체적인 구조를 표현하기 위해 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소를 패키지(package) 또는 모듈(module)이라고 한다.