추상화는 도메인에 존재하는 개념들을 구조화하고 단순화하기 위해 사용한다.
- 분류와 인스턴스화
- 일반화와 특수화
- 집합과 분해
속성과 행위가 유사한 객체에 공통적으로 적용되는 관념이나 아이디어
즉, 객체를 분류하고 범주로 묶는 것은 속성과 행위가 유사한 객체에게 개념을 적용하는 것을 의미한다. 이 '범주'는 세상을 보는 렌즈로 이해하면 된다. 범주를 통해 세상의 모든 객체를 분류할 수 있게 된다.
세상에 존재하는 객체에 개념을 적용하는 과정
- 분류는 개념을 나타내는 집합의 구성 요소로 포함시킨다.
예를 들어 자동차
- 다양한 자동차가 지나가지만, 그 모든 객체 들을 '자동차'라는 개념을 적용시킨다.
- '자동차'라는 개념을 통해 다양한 자동차들을 '분류' 한다.
- 다양한 자동차들을 '자동차'라는 집합에 포함시킨다.
- 개념은 객체지향에 있어서 타입이 되므로, 분류는 객체와 타입을 연관시키는 것이다.
객체를 타입에 따라 분류하기 위해서는 기준에 대한 명확한 정의가 필요하다. 이를 위해서는 세가지 관점에서의 정의가 필요하다.
- 심볼 - 타입의 구별되는 이름
- 내연 - 타입의 정의 즉, 기준
- 외연 - 타입에 속한 객체의 집합
다중 분류
한 객체가 한 시점에 여러 타입에 속할 수 있는 것
동적 분류
객체가 자신의 타입을 변경할 수 있는 것
객체 지향적 언어는 두 분류를 허용하지 않는다.
타입을 구현하는 수단
클래스와 타입은 동일하지 않으며, 타입은 인터페이스와 추상 클래스를 통해서도 구현이 가능하다.
범주를 계층화하여 나타낼 때, 상위에 위치한 범주를 하위에 위치한 범주의 일반화라고 하고, 하위에 위치한 범주를 상위에 위치한 범주의 특수화라고 한다.
슈퍼타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화이다.
일반화와 특수화의 계층구조에서 서브타입은 슈퍼타입이 가진 본질적인 속성과 함께 자신만의 추가적인 속성을 가진다.
내연의 관점에서 서브타입의 내연이 슈퍼타입의 내연을 포함하고 있다. 반면에 외연은 슈퍼타입의 외연이 서브타입의 외연을 포함한다.
일반화와 특수화 관계를 구현하는 방식은 클래스 간 상속이다.
- 완전한 일반화의 구현은 불가능하다. 일반화의 원칙에 따르면 서브타입은 슈퍼타입의 내연을 100% 만족해야하나, 상속의 관계일 경우 메서드를 수정하고 확장할 수 있기 때문에 100% 만족으로 볼 수 없다.
- 상속은 서브타이핑과 서브클래싱의 용도로 사용된다.
서브타이핑
서브클래스가 슈퍼클래스를 대체할 수 있는 경우로, 인터페이스 상속이라고 한다.
- 대체 가능성을 내포하고 있다.
서브클래싱
서브클래스가 슈퍼클래스를 대체할 수 없는 경우로, 구현 상속이라고 한다.
- 단순히 코드만 공유하는 형태이다.
위임
메시지가 상위 클래스로 올라가면서 처리되는 행위
객체간의 전체 - 부분 관계를 구현하기 위해 합성관계를 사용한다.
부분을 전체 안에 캡슐화함으로써 인지 과부하를 방지한다. 즉, 부분적인 존재를 일시적으로 감추어 복잡성을 낮출 수 있다.
전체적인 구조를 표현하기 위해 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성요소
합성 관계가 내부에 포함된 객체들의 존재를 감춤으로써 내부 구조를 추상화하는 것처럼, 패키지는 내부에 포함된 클래스들을 감춤으로써 시스템의 구조를 추상화한다.