추상화 기법
추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용할 수 있는 기본적인 인지 수단이다
동일한 특성을 공유하는 객체들을 타입으로 분류하는 것이 추상화 기법의 예다.
각 추상화 기법은 결국 복잡성을 낮추기,세부사항 감추기
- 분류와 인스턴스화
분류는 객체의 구체적인 세부 사항을 숨김, 인스턴스 간 공유하는 공통적인 특성을 기반으로 범주화
인스턴스화는 범주로부터 객체를 생성하는 것 - 일반화와 특수화
범주 사이의 차이를 숨기고 번주 간에 공유하는 공통적인 특성을 강조
이 반대가 특수화 - 집홥과 분해
부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정을 가리킴
집합의 반대 과정은 전체를 부분으로 분리하는 분해
분류와 인스턴스화
개념과 범주
개념이란 속성과 행위가 유사한 객체에 공통적으로 적용되는 관념이나 아이디어다 -Martin
객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미한다.
나무라는 범주에는 '푸른 잎과 갈색의 줄기를 가진 다년생 식물'이라는 개념을 적용할 수 있다.
객체들을 공통적인 특성을 기반으로 범주로 묶고, 개념을 적용하는 것은 범주라는 정신적인 렌즈를 통해 세상을 바라보는 것과 유사하다.
자동차라는 렌즈를 통해 바라본 세상은 자동차 범주에 속한 객체만 보일 것
세상에 존재하는 객체에 개념을 적용하는 과정을 분류라고 한다. -Martin
분류는 객체를 특정한 개념을 가타내는 집합의 구성 요소로 포함시킨다.
세상에 존재하는 서로 다른 상태를 가진 무수히 많은 자동차와 나무를 개별적으로 다루기는 불가능하다. 그래서 범주로 묶어 세상이 가진 복잡성을 낮춘다.
사람들은 분류를 통해 개별 현상을 하나의 개념으로 다룬다.
이때 '수많은 개별적인 현상들'을 객체라하고, '하나의 개념'을 타입이라고 한다.
분류는 객체를 타입과 연관시키는 것이다.
분류의 역은 타입에 해당하는 객체를 생성하는 과정으로 인스턴스화 또는 예시라고 한다.
객체지향 세계에서 개념을 가리키는 표준 용어는 타입이다. -Martin
객체를 타입의 인스턴스라고 한다.
분류는 객체와 타입 간의 관계를 나타낸 것이다.
어떤 객체가 타입의 정의에 부합할 경우 그 객체는 해당 타입으로 분류되며 자동으로 타입의 인스턴스가 된다.
타입
타입을 객체의 분류 장치로서 적용할 수 있으려면 다음과 같은 세 가지 관점에서의 정의가 필요하다 - Martin
- 심볼
타입을 가리키는 간단략 명칭 - 내연
타입의 완전한 정의 - 외연
타입에 속하는 모든 객체들의 집합
외연과 집합
타입의 외연은 타입에 속하는 객체들의 집합으로 표현
집합 = 외연
객체들은 동시에 서로 다른 집합에 포함될 수도 있다.
한 객체가 하나의 타입에 속하는 경우 단일 분류(single classification)
여러 타입에 속하는 경우 다중 분류(multiple classification)라 한다.
대부분의 객체지향 프로그래밍 언어들은 단일 분류만을 지원한다.
대부분의 언어에서 한 객체는 오직 한 클래스의 인스턴스여야만 하며 동시에 두 개의 클래스의 인스턴스일 수는 없다. 이 관점에서 다중 분류를 다중 상속과 혼동해서는 안된다.
다중 상속은 하나의 타입이 다수의 슈퍼타입을 가질 수 있도록 허용하지만 타입 정의를 생략할 수는 없다. 반면 다중 분류는 특정한 타입을 정의하지 않고도 하나의 객체가 서로 다른 타입의 인스턴스가 되도록 허용한다.
객체를 특정한 타입으로 분류하면 해당 객체는 타입의 집합에 포함된다.
객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있는 경우 이를 동적 분류(dynamic classification)이라고 한다.
객체가 자신의 타입을 변경할 수 없는 경우 이를 정적 분류(static classification)라 한다.
하나의 컴퓨터가 시간의 흐름에 따라 교육용 컴퓨터에서 사무용 컴퓨터로, 다시 사무용에서 교육용 컴퓨터로 분류가 바뀌는 과정은 컴퓨터가 여러 집합에 속할 수 있다는 것
다중 분류와 동적 분류는 서로 배타적인 개념이 아니다. 함께 적용하는 것이 실세계의 복잡성을 모델링하는데 유용하다.
클래스 기반의 객체지향에서 타입은 클래스로 구현된다.
대부분의 언어는 일단 클래스로부터 인스턴스를 생성한 후 클래스를 변경할 수 있는 방법을 제공하지 않는다. 즉, 객체의 타입을 변경할 수 없다. 따라서 우리가 사용하는 대부분의 언어는 정적 분류만 허용하며 동적 분류를 구현할 수 있는 방법을 제공하지 않는다.
이처럼 언어의 제약으로 인해 다중 분류와 동적 분류를 구현으로 옮기기 쉽지 않다.
절충안으로 도메인 모델의 초안을 다중 분류와 동적 분류로 만들고, 실제 구현에 적합하도록 단일 분류와 정적 분류 방식으로 객체들의 범주를 재조정하는 것이 좋다.
디자인 템플릿은 유연성이라는 측면에서 꼭 필요한 경우에만 사용
단순함을 위해서는 단일 분류와 정적 분류를 선택
클래스
타입을 구현하는 가장 보편적인 방법
클래스는 타입 구현 용도 외에 코드 재사용 용도로 사용할 수 있다.
추상 클래스, 인터페이스도 타입 구현 가능
현재 객체지향 패러다임은 아리스토텔레스 분류법의 근간을 형성하는 아이디어를 근간으로 한다
아리스토 텔레스는 객체의 특성을 본질적인 속성과 우연적인 속성으로 분류했다.
본질(essence)이란 한 사물의 가장 핵심적이고 필수불가결한 솓성
본질적인 속성 외 속성을 우연적(accidental)속성이라고 한다.
예컨대 한 사람이 취직을 해서 회사원이 되어도 그 사람은 여전히 그 사람이다. 회사원이 그 사람의 본질을 바꾸지는 못한다.
클래스는 객체가 공유하는 본질적인 속성을 정의한다. 대부분의 객체지향 언어에는 우연적인 속성은 추가할 수 없다.
안타깝지만 분류 수준과 결과는 누가 분류를 하는가와 무엇을 기반으로 분류하는가에 따라 크게 달라진다. 실제로 사람들은 동일한 사물을 다양한 방식으로 인식하며 다양한 방식으로 분류한다.
자바스크립트처럼 클래스가 존재하지 않는 프로토타입 기반의 언어는 아리스토텔레스의 객관적인 분류 체계가 존재한다는 사상에 대한 철학적 의문에 그 뿌리를 두고 있다. 클래스가 없는 프로토타입 언어에서 분류와 인스턴스화는 프로토타입이라는 객체의 복사를 통해 이뤄진다.
'IT책, 강의 > 객체지향의 사실과 오해(역할, 책임, 협력 관점에서 본 객체지향)' 카테고리의 다른 글
부록 A 추상화 기법 - 2 (0) | 2023.01.07 |
---|---|
07 함께 모으기 (0) | 2023.01.01 |
06 객체 지도 - 2 (0) | 2022.12.29 |
06 객체 지도 - 1 (1) | 2022.12.24 |
05 책임과 메시지 -2 (0) | 2022.12.22 |