반응형
추상화 기법
- 추상화 : 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용하는 인지 수단
- 추상화 기법의 종류
- 분류와 인스턴스화
- 분류 : 객체의 구체적인 세부사항을 숨기고 인스턴스 간에 공유하는 공통적인 특성을 기반으로 범주를 형성하는 과정
- 인스턴스화 : 범주로부터 객체를 생성하는 과정 (분류의 역)
- 예시 : 승용차, 버스, 트럭을 자동차로 분류
- 일반화와 특수화
- 일반화 : 범주 사이의 차이를 숨기고 범주 간에 공유하는 공통적인 특성을 강조하는 과정
- 특수화 : (일반화의 역)
- 예시 : 자동차와 자전거를 운송 수단으로 일반화
- 집합과 분해
- 집합 : 부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정
- 분해 : 전체를 부분으로 분리하는 과정 (집합의 역)
- 예시 : 자동차를 섀시, 차체, 엔진으로 분해 / 차체를 문, 후드로 분해
- 분류와 인스턴스화
분류와 인스턴스화
- 분류 : 세상에 존재하는 객체에 개념을 적용하는 과정 (객체를 타입과 연관시키는 것) ⇒ 복잡성↓
- 인스턴스화 : 타입에 해당하는 객체를 생성하는 과정 (객체 = 타입의 인스턴스)
- 개념 : 속성과 행위가 유사한 객체에 공통적으로 적용되는 관념이나 아이디어
- 타입 : 개별 현상을 분류하는 하나의 개념 (타입 = 개념)
- 타입을 객체의 분류 장치로서 적용할 수 있으려면 심볼, 내연, 외연 측면에서의 정의가 필요
- 심볼 : 타입을 가리키는 간략한 이름이나 명칭 (ex. 자동차)
- 내연 : 타입의 완전한 정의 (ex. 원동기를 동력원으로해서 사람이나 화물을 운반하는 기계)
- 외연 : 타입에 속하는 모든 객체들의 지밥 (ex. 승용차, 버스, 트럭)
- 타입의 외연(객체)은 동시에 서로 다른 집합에 포함될 수 있음 (∵ 한 시점에 동일한 객체를 다양한 방식으로 인지)
- 단일 분류 : 한 객체가 한 시점에 하나의 타입에만 속하는 것
- 다중 분류 : 한 객체가 한 시점에 여러 타입에 속하는 것 (다중 분류 ≠ 다중 상속)
- 대부분의 언어는 단일 분류만 지원 (∴ 한 객체는 오직 한 클래스의 인스턴스여야만 함)
- 객체는 타입을 변경할 수 있음
- 동적 분류 : 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있는 경우
- 정적 분류 : 객체가 자신의 타입을 변경할 수 없는 경우
- 대부분의 언어는 정적 분류만 허용 (∴ 클래스로부터 인스턴스를 생성한 후 클래스를 변경할 수 없음)
- 다중 분류와 동적 분류 관점에서 도메인 모델의 초안을 만든 후 실제 구현에 적합하도록 단일 분류와 정적 분류 방식으로 객체들의 범주를 재조정하는 편이 분석과 구현 간의 차이를 메울 수 있는 가장 현실적인 방법
(다중 분류와 동적 분류를 구현할 수 있는 디자인 템플릿이 있지만, 유연성 측면에서 반드시 필요한 경우에만 사용해야 함)
- 타입을 객체의 분류 장치로서 적용할 수 있으려면 심볼, 내연, 외연 측면에서의 정의가 필요
- 클래스 : 객체가 공유하는 본질적인 속성 정의
- 동일한 범주에 속하는 객체는 동일한 클래스의 인스턴스여야 함
- 동일한 범주에 속하는 객체는 모두 동일한 속성을 가져야만 함
일반화와 특수화
- 일반화와 특수화 : 계층 구조 안에 존재하는 타입(개념) 간의 관계
- 일반화 : 계층의 상위에 위치한 범주를 계층의 하위에 위치한 범주의 일반화라고 함
- 특수화 : 계층의 하위에 위치한 범주를 계층의 상위에 위치한 범주의 특수화라고 함
- 슈퍼타입 : 다른 타입보다 일반적인 타입
- 서브타입 : 다른 타입보다 특수한 타입
- 슈퍼타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화
- 서브타입은 슈퍼타입이 가진 본질적인 속성과 함께 자신만의 추가적인 속성을 가짐
- 서브타입은 슈퍼타입의 본질적인 속성을 모두 포함하므로, 모든 서브타입들이 슈퍼타입의 속성을 공유
- 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 '100% 규칙'과 'Is-a 규칙'을 준수해야 함
- 100% 규칙 : 슈퍼타입의 정의가 100% 서브타입에 적용돼야 함
- Is-a 규칙 : 서브타입의 모든 인스턴스는 슈퍼타입의 집합에 포함돼야 함 ( 사람은 동물이다 (o) but, 동물은 사람이다 (x) )
- 클래스간 상속 ⇒ 일반화와 특수화 구현
(모든 상속 관계가 일반화 관계인 것은 아님)- 일반화의 원칙 : 한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응(서브타입이 슈퍼타입을 대체 가능)해야 한다는 것
- 구조적 순응 : 서브타입이 슈퍼타입을 대체하더라도 구조에 관한 동일한 기대집합을 만족시킬 수 있음
- 행위적 순응 : 서브타입은 슈퍼타입을 행위적으로 대체 가능해야 함
- 상속의 용도
- 일반화의 원칙 : 한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응(서브타입이 슈퍼타입을 대체 가능)해야 한다는 것
서브타이핑 | 서브클래싱 |
- 서브클래스가 슈퍼클래스를 대체할 수 있는 경우 - 설계의 유연성이 목표 - 인터페이스 상속(interface inheritance)이라고 함 |
- 서브클래스가 슈퍼클래스를 대체할 수 없는 경우 - 코드의 중복 제거와 재사용이 목적 - 구현 상속(implementation inheritance)이라고 함 |
집합과 분해
- 집합 : 안정적인 형태의 부분으로부터 전체를 구축하는 행위
- 불필요한 세부 사항 추상화 ⇒ 복잡성↓
- 추상화 메커니즘인 동시에 캡슐화 메커니즘
- 분해 : 전체를 부분으로 분할하는 행위
- 합성 관계 ⇒ 객체와 객체 사이의 전체-부분 관계 구현 (내부에 포함된 객체들의 존재를 감춤으로써 내부 구조 추상화)
- 합성 관계 ↔︎ 연관 관계
- 합성 관계로 연결된 객체는 포함하는 객체가 제거될 때 내부에 포함된 객체도 함께 제거됨
- 연관 관계로 연결된 객체는 독립적으로 제거될 수 있음 (생명주기와 관련된 어떤 제약도 없음)
- 패키지(or 모듈) : 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소
- 시스템의 전체적인 구조를 이해하기 위해 한 번에 고려해야 하는 요소의 수를 줄일 수 있음
- 개별 클래스가 아닌 클래스의 집합 캡슐화 ⇒ 복잡도↓
- 내부에 포함된 클래스들을 감춤으로써 시스템의 구조 추상화
반응형
'개발 도서 > 객체지향의 사실과 오해' 카테고리의 다른 글
[객체지향의 사실과 오해] 07장 : 함께 모으기 (0) | 2023.03.31 |
---|---|
[객체지향의 사실과 오해] 06장 : 객체 지도 (0) | 2023.03.31 |
[객체지향의 사실과 오해] 05장 : 책임과 메시지 (0) | 2023.03.13 |
[객체지향의 사실과 오해] 04장 : 역할, 책임, 협력 (1) | 2023.03.13 |
[객체지향의 사실과 오해] 03장 : 타입과 추상화 (0) | 2023.03.13 |