일반화와 특수화
범주의 계층
18세기 자연에 대한 관심 증가로 매년 수천 종의 생물들이 새롭게 발견
끝임없이 쏟아져 보편적 분류 체계가 필요하다 느낌
1735년 카를로스 린네 자연의 체계를 발표
계문강목과속종
린네의 분류 체계는 범주 간의 계층적인 구조를 가짐
모든 포유류는 척추가 있고 새끼를 낳아 젖을 먹여 기른다는 특징을 공유
따라서 얼룩고양이도 척추가 있고 새끼를 낳아 기르며 젖을 먹여 새끼를 기를 것이라는 사실을 쉽게 알 수 있다.
린네의 계층 구조는 좀 더 세부적인 범주가 계층의 하위에 위치하고 좀 더 일반적인 범주가 계층의 상위에 위치한다.
계층 상위에 위치한 범주를 계층 하위에 위치한 범주의 일반화
계층의 하위에 위치한 범주는 계층의 상위에 위치한 범주의 특수화라고 한다.
서브타입
객체지향의 세게에서 범주는 개념, 개념은 타입
따라서 일반화와 특수화는 계층 구조 안에서 존재하는 타입 간의 관계를 의미한다.
어떤 타입이 다른 타입보다 일반적이라면 슈퍼 타입(supertype)
어떤 타입이 다른 타입보다 좀 더 특수하다면 서브타입(subtype)이라고 한다.
슈퍼타입은 서브타입의 일반화
서브타입은 슈퍼타입의 특수화
일반화와 특수화 계층 구조에서 서브타입은 슈퍼타입이 가진 본질적인 속성과 함께 자신만의 추가적인 속성을 가진다.
크레이그 라만은 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 100% 규칙과 Is-a 규칙을 준수해야한다고 했다.
100% 규칙은 내연 관련
Is-a 규칙은 외연 관련 규칙이다.
- 100%규칙
슈퍼타입의 정의가 서브타입에 100% 적용되어야 한다
서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야 한다. - Is-a 규칙(is-a-kind-of)
서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함돼야 한다.
"서브타입은 슈퍼타입이다" 라는 말에 대입해서 맞다면 적용되는 것으로 본다.
인간은 동물이다. (일치) / 컴퓨터는 동물이다(불일치)
서브타입이 슈퍼타입의 부분집합인 것을 알 수 있다.
상속
일반화 특수화 관계를 구현하는 일반적인 방법은 클래스 간 상속을 사용하는 것
반드시 모든 상속 관계가 일반화 관계인 것은 아니다.
일반화의 원칙은 한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응(conformance)해야 한다는 것
순응은 구조적인 순응(structural conformance)과 행위적인 순응(behavioral conformance)의 두 가지 종류가 있다.
두 가지 모두 특정 기대 집합에 대해 서브타입의 슈퍼타입에 대한 대체 가능성을 의미한다.
- 구조적인 순응의 경우 기대 집합은 속성과 연관관계에 관한 것
- 행위적인 순응의 경우 기대 집합은 행위가 동일한 계약을 기반으로 하느냐
구조적인 순응은 타입의 내연과 관련된 100% 규칙을 의미(속성)
Person 클래스에 name 속성이 있다고 가정, Person의 서브타입인 Employee 역시 name 속성을 가져야 한다.
Employee 클래스는 구조적으로 Person클래스를 대체할 수 있다.
행위적 순응은 흔히 리스코프 치환 원칙(Liskov Substitution Principle,LSP)이라고 한다.
Person.getAge()가 나이를 반환한다면 Employee.getAge()역시 나이를 반환해야 한다.
Employee는 Person에 대해 행위적으로 순응하기 때문에 대체 가능하다.
상속의 또다른 용도는 코드 중복을 방지 공통 코드를 재사용하기 위한 언어적 메커니즘을 제공하는 것
상속은 서브타이핑(subtyping)과 서브클래싱(subclassing)의 두 가지 용도로 사용될 수 있다.
- 서브 클래스가 슈퍼클래스를 대체할 수 있는 경우 이를 서브타이핑이라고 한다.
- 서브 클래스가 슈퍼클래스를 대체할 수 없는 경우 서브클래싱이라고 한다.
서브타이핑은 설계의 유연성이 목표
서브클래싱은 코드의 중복 제거와 재사용이 목적
서브타이핑은 인터페이스 상속(interface inheritance)
서브클래싱을 구현 상속(implementation inheritance)이라고 한다.
클래스가 다른 클래스를 상속받았다는 사실만으로 두 클래스 간의 관계가 서브타이핑인지, 서브클래싱인지 여부를 결정할 수 없다.
서브타이핑의 전제 조건은 대체 가능성이기 때문에 클라이언트 관점에서 실제로 어떻게 사용되고 있는지를 확인해야 한다.
가능한 모든 상속관계가 서브타이핑의 대체 가능성을 준수하도록 하는 것이 좋다
여러 클래스로 구성된 상속 계층에서 수신된 메시지를 이해하는 기본적인 방법은 클래스 간 위임(delegation)을 사용하는 것
집합과 분해
계층적인 복잡성
복잡성은 계층의 형태를 띈다.
단순한 형태로부터 복잡한 형태로 진화하는데 걸리는 시간은 그 사이에 존재하는 안정적인 형태의 수와 분포에 의존한다
시계는 중간 부품들을 조립해서 만들어진다.
그 중간 부품은 더 작은 부품들을 조립해서 만들어진다.
결국 시계는 전체적으로 연쇄적인 계층 구조로 구성된다.
이 같이 안정적인 형태의 부분으로부터 전체를 구축하는 행위를 집합이라고 한다.
그 반대로 전체를 부분으로 분할하는 행위를 분해라고 한다.
집합의 가치는 많은 수의 사물들의 형상을 하나의 단위로 다룸으로써 복잡성을 줄일 수 있다는 데 있다.
집합은 불필요한 세부 사항을 배제하고 큰 그림에서 대상을 다룰 수 있게 한다. (추상화, 캡슐화)
그러나 필요한 시점에는 전체를 분해함으로써 그 안에 포함된 부분들을 새로운 전체로 다룰 수 있다.
합성 관계
상품 주문을 생각해보자.
상품 주문은 여러 상품을 한 번에 주문할 수 있다.
이때 각 상품을 몇 개 주문했는지를 가리켜 주문 항목이라고 한다.
주문 항목은 주문과 독립적으로 존재할 수 없다. 반드시 어느 한 주문에 주문항목이 일부로 생성되기 때문이다.
객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성 관계를 사용한다.
합성관계는 부분을 전체 안에 캡슐화함으로써 단순화한다.
즉, 주문과 상품만이 존재하는 것처럼 모델을 다룰 수 있다.
필요시 주문 내부의 세부적인 주문항목을 보는 것
주문항목은 주문과 전체와 부분을 나타내는 합성관계다.
주문항목과 상품 간에도 선이 연결되어 있는데 이를 연관 관계라 한다.
일반적으로 합성관계로 연결된 객체는 포함하는 객체가 제거되면 같이 제거된다.
주문이 제거되면 주문항목이 존재할 수 없으니 같이 제거
연관 관계는 주문 제거되더라도 상품은 계속 판매될 것이다.
패키지
합성 관계를 통해 단순화 하더라도 결국 클래스 수가 많아지면 복잡해진다.
서로 관련성이 높은 클래스 집합을 논리적인 단위로 통합
관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소를 패키지(package)또는 모듈(module)이라한다.
합성 관계가 내부에 포함된 객체들의 존재를 감춤으로써 내부 구조를 추상화하는 것 처럼 패키지는 내부에 포함된 클래스들을 감춤으로써 시스템의 구조를 추상화한다.
'IT책, 강의 > 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)' 카테고리의 다른 글
부록 A 추상화 기법 - 1 (0) | 2023.01.04 |
---|---|
07 함께 모으기 (0) | 2023.01.01 |
06 객체 지도 - 2 (0) | 2022.12.29 |
06 객체 지도 - 1 (1) | 2022.12.24 |
05 책임과 메시지 -2 (0) | 2022.12.22 |