지식조각모음
추상화 기법 본문
추상화 기법
- 추상화: 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용할 수 있는 가장 기본적인 인지 수단이다.
추상화 기법의 종류
- 분류와 인스턴스화
- 분류: 객체의 세부 사항을 숨김. 인스턴스 간의 공통적 특성을 기반으로 범주를 설정
- 인스턴스: 분류의 역. 범주로부터 객체를 생성
- 일반화와 특수화
- 일반화: 범주 간 공통적인 특성을 강조
- 특수화: 일반화의 역
- 집합과 분해
- 집합: 세부사항 보다 부분을 이용해서 전체를 형성하는 과정
- 분해: 집함의 역. 전체를 부분으로 분리.
분류와 인스턴스화
개념과 범주
- 개념
- 속성과 행위가 유사한 객체에 공통적으로 적용되는 관념
- = 타입
- 예: 승용차, 버스, 트럭 ➡️ 바퀴가 있고 사람들을 이동시키는 운송수단 ➡️ 자동차
- 분류
- 객체에 개념을 적용하는 과정
- 객체를 특정한 개념의 집합의 구성 요소로 포함시킨다.
- 예: 승용차를 자동차라는 개념을 적용할 수 있는 집합에 포함시킨다.
- 객체
- 개별적인 현상들
- 타입
- 하나의 개념
- 객체를 분류하여 하나의 타입과 연관시킨다.
- 타입을 인스턴스화하여 객체를 생성한다.
타입
객체를 타입에 따라 분류하기 위해서는 세 가지 정의가 필요하다.(참고: 타입과 추상화)
- 심볼: 타입을 가리키는 간략한 이름이나 명칭
- 내연: 타입의 정의
- 외연: 타입에 속하는 모든 객체들의 집합
예를 들면 다음과 같다.
- 심볼: 자동차
- 내연: 원동기를 동력원으로해서 주행하는 사람이나 화물을 운반하는 기계
- 외연: 승용차, 버스, 트럭 등
내연을 만족하면 외연의 한 요소로 포함된다. 그리고 이 집합의 원소들을 심볼로 부른다.
외연과 집합
외연은 집합이다. 그리고 하나의 객체는 서로 다른 집합에 동시에 속할 수 있다.
- 단일 분류: 한 객체가 한 시점에 하나의 타입에만 속하는 것. 대부분의 프로그래밍 언어에서 지원
- 다중 분류: 한 객체가 한 시점에 여러 타입에 속할 경우
다중 분류는 하나의 객체가 서로 다른 타입의 인스턴스가 되도록 허용한다. ➡️ 인터페이스 이야기일까??
- 동적 분류: 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있는 경우
- 정적 분류: 객체가 자신의 타입을 변경할 수 없는 경우. 대부분의 프로그래밍 언어에서 지원
클래스
타입을 구현하는 가장 보편적인 방법. 클래스 != 타입.
객체지향 패러다임은 생물적 분류와 비슷하다. 만약 객체들이 동일한 특성을 가진다면 동일한 카테고리에 속한다. 이런 특성들은 본질적인 속성이며 객체의 가장 핵심적이고 필수불가결한 속성이다. 이 외의 속성은 우연적인 속성이다. 그렇기 때문에 대부분의 객체지향 언어는 본질적인 속성만 표현할 수 있다.
일반화와 특수화
범주의 계층
범주간의 계층구조를 가지면 한 계층과 그 이하의 계층은 같은 속성을 지난다는 사실을 알 수 있다. 예를 들어 ‘얼룩고양이’는 포유류강에 속한다. 얼룩고양이가 어떤 것인지 모르더라도 포유류의 속성을 가진다는 것은 알 수 있다.
이렇게 상대적으로 상위 계층과 하위 계층으로 나누었을때, 상위 계층의 속성을 하위 범주의 일반화라고 하며, 하위 계층은 상위 범주의 특수화라고 한다. 예를 들어 얼룩고양이는 포유류보다 더 하위 계층이기 때문에 ‘얼룩고양이는 포유류의 특수화’이다.
서브타입
범주 = 개념 = 타입
- 슈퍼타입: 어떤 타입이 다른 타입보다 일반적인 경우 (포유류)
- 서브타입: 어떤 타입이 다른 타입보다 특수한 경우 (얼룩 고양이)
- 슈퍼타입의 본질적인 속성을 포함
일반화와 특수화를 통해 다른 타입에 대한 추론이 가능하다. 서브타입은 자신의 본질을 가지면서 슈퍼타입의 본질도 함께 가진다.
서브타입이 되기 위해서는 다음과 같은 규칙을 준수해야 한다.
- 100% 규칙: 슈퍼타입의 정의가 100% 서브타입에 적용돼야만 한다. 서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야 한다.
- Is-a 규칙(일반화 관계): 서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함돼야 한다. 이는 대개 영어로 ‘subtype is a supertype’이라는 구문을 만들어 테스트할 수 있다.
상속
일반화와 특수화 관계를 구현하기 위한 가장 일반적인 방법
- 일반화의 원칙: 서브타입이 되기 위해서는 슈퍼타입에 순응해야 한다.
- 서브타입의 대체 가능성
순응
- 구조적인 순응
- 내연과 관련된 100% 규칙(서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치해야 한다)
- 서브타입으로 대체하더라도 구조에 관한 기대를 만족한다.
- 예:
Person이name이라는 속성을 가진다.Person의 서브타입인Employee도name이라는 속성을 가지므로Employee는Person을 대체할 수 있다.
- 행위적인 순응
- 타입의 행위와 관련된 것.
- 리스코프 치환 원칙
- 예:
Person는getAge()라는 메세지에 대한 응답으로 나이를 반환한다. 서브타입인Employee도getAge()라는 메세지에 나이를 반환해야 한다.
상속의 용도
- 서브타이핑
- 서브클래스가 슈퍼클래스를 대체할 수 있는 경우
- 설계의 유연성이 목표
- = 인터페이스 상속
- 구조적, 행위적 순응 관계를 의미하며, 대체 가능성을 내포
- 서브클래싱
- 서브클래스가 슈퍼클래스를 대체할 수 없는 경우
- 코드 중복 제거와 재상용이 목표
- = 구현 상속
집합과 분해
계층적인 복잡성
- 집합: 안정적인 현태의 부분으로부터 전체를 구축하는 행위
- 각각의 객체를 하나의 단위로 다룸으로써 복잡성을 줄인다. ➡️ 한 번에 다뤄야하는 요소를 감소하여 인지 과부하를 방지한다.
- 불필요한 세부사항을 추상화한다.
- 캡슐화 매커니즘이기도 하다.
- 분해: 집합의 반대. 전체를 부분으로 분할하는 행위
- 필요에 따라 집합을 분해하여 그 안의 부분을 새로운 전체로 다룬다.
합성 관계
- 상품 주문
- ↳ 주문 항목
각 주문 항목은 상품 주문과 독립적으로 존재 할 수 없다. 주문 항목은 어떤 주문의 일부로 생성되기 때문에 두 객체 사이의 관계는 합성 관계이다.

합성 관계는 부분을 전체 안에 캡슐화함으로써 인지 과부하를 방지한다. 주문 항목은 주문의 일부이므로 주문 항목에 관한 세부 사항을 무시하고 주문과 상품만 존재하는 것처럼 모델을 다룰 수 있다.
패키지
관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성요소. 모듈이라고도 한다.
'책 > 객체지향의 사실과 오해' 카테고리의 다른 글
| 함께 모으기 (0) | 2023.09.11 |
|---|---|
| 객체 지도 (0) | 2023.09.06 |
| 책임과 메시지 (0) | 2023.08.31 |
| 역할, 책임, 협력 (0) | 2023.08.17 |
| 타입과 추상화 (0) | 2023.08.14 |