Open j03y14 opened 7 months ago
추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용할 수 있는 기본적인 수단이다.
각 추상화 기법은 복잡성을 낮추기 위해 사물의 특정한 측면을 감춘다.
객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미한다.
‘나무’ 라는 범주안에 ‘푸른 잎과 갈색의 줄기를 가진 다년생 식물’ 이라는 개념을 적용할 수 있다.
세상에 존재하는 객체에 개념을 적용하는 과정을 분류라고 한다.
‘수 많은 개별적인 현상들’을 객체라고 하고 ‘하나의 개념’을 타입이라고 한다. 다시말해 분류는 객체를 타입과 연관시키는 것이다.
명확한 정의가 내려지면 인스턴스인지 여부를 판단할 수 있다
집합은 외연을 가리키는 또다른 명칭이다
객체들은 동시에 서로 다른 집합에 포함될 수 있다.
다만, 대부분의 언어는 단일 분류와 정적 분류만을 허용하며, 한 객체는 오직 한 클래스의 인스턴스여야만 한다.
단일 분류: 한 객체가 한 시점에 하나의 타입에만 속하는 것 ↔ 다중 분류
정적 분류: 객체가 한 집합에서 다른 집합의 원소로 타입을 변경할 수 없는 것 ↔ 동적 분류
다중 분류와 동적 분류 관점에서 도메인 모델의 초안을 만든 후 실제 구현에 적합하도록 단일 분류와 정적 분류 방식으로 객체들의 범주를 재조정하는 편이 분석과 구현간의 차이를 메울 수 있는 가장 현실적인 방법이다.
객체지향 언어는 본질적인 속성은 표현할 수 있지만 우연적인 속성은 표현할 수 없다. 따라서 동일한 범주에 속하는 객체는 모두 동일한 속성을 가져야만 한다.
생물 분류 예시
계층의 상위에 위치한 범주를 계층의 하위에 위치한 범주의 일반화 라고한다.
반대를 특수화 라고한다.
일반화와 특수화는 계층 구조 안에 존재하는 타입 간의 관계를 의미한다.
일반화의 원칙은 한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응해야한다.
시계 조립 예시
각 주문 항목은 주문과 독립적으로 존재할 수 없다.
주문 항목은 반드시 어떤 한 주문의 일부로 생성되기 때문이다.
합성 관계는 부분을 전체 안에 캡슐화 함으로서 인지 과부하를 방지한다.
소프트웨어의 전체적인 구조를 표현하기 위해 관련된 클래스의 집합을 하나의 논리적인 단위로 묶는 구성 요소를 패키지 또는 모듈이라고 한다.
서브 클래스가 대체할 수 없는 경우가 뭐가 있지?
문자열 다루는 클래스에서 사용하는 기능들을 url 클래스에서 사용하고 싶을 때?
이런 예시로 설명 가능할듯.
도메인의 개념을 구조화 하고 단순화 하기 위한 다양한 추상화 기법이 존재한다.
분류와 인스턴스화
객체를 분류하고 범주로 묶는 것은 공통의 개념을 적용하는 것을 의미한다. 분류는 특정한 개념으로 객체를 집합의 구성요소로 포함시킨다.
개념 = 타입 분류는 객체와 타입간의 관계를 설명한 것이다.
단일 분류, 다중 분류 대부분의 언어는 단일 분류만 지원한다.
객체가 동적으로 자신이 속하는 타입을 변경할 수 있으면 동적 분류라고 한다. 대부분의 언어는 정적 분류만 지원한다.
다중 분류와 동적 분류 관점에서 도메인 모델 초안을 만들고 실제 구현에 적합하도록 객체들의 범주를 재조정하는 것이 가장 현실적이다.
클래스
객체지향 패러다임은 아리스토텔레스의 분류법의 근간을 형성하는 아이디어를 기반으로 한다.
객체의 특성
클래스는 본질적인 속성을 정의한다. 우연한 속성은 표현하지 못하므로 동일한 범주에 속하는 객체는 모두 동일한 속성을 가져야 한다.
일반화와 특수화
계층 구조 안에 존재하는 타입간의 관계를 의미한다.
기존 범주가 가진 속성을 새로운 범주가 포함할 경우 새로운 범주는 기존 범주를 확장한다.
어떤 타입이 서브타입이 되기 위해서는 100% 법칙과 is a 법칙이 적용되어야 한다.
집합의 분해
안정적인 형태의 부분으로부터 전체를 구축하는 행위를 집합이라고 한다.
한 번에 다뤄야 하는 요소의 수를 감소시켜서 인지 과부하를 방지한다.
명확하게 경계가 없는 경우에도 사람은 자연스럽게 추상적인 경계를 찾을 수 있다.