IT 책 독서록

[객체지향의 사실과 오해] 부록 A 내용정리

robinjoon98 2022. 3. 18. 11:57

2021.07.20 - [IT 책 독서록] - [객체지향의 사실과 오해] 3장 내용정리

 

[객체지향의 사실과 오해] 3장 내용정리

2021.07.14 - [IT 책 독서록] - [객체지향의 사실과 오해] 2장 내용 정리 [객체지향의 사실과 오해] 2장 내용 정리 2021.07.13 - [IT 책 독서록] - [객체지향의 사실과 오해] 1장 내용 정리 [객체지향의 사실과

blog.robinjoon.space

부록에선, 3장에서 다룬 추상화에 대해 좀 더 깊게 다룬다. 따라서, 이전 발행글도 3장으로 했다.

추상화 기법

추상화 기법에는 3가지 종류가 있다.

  1. 분류와 인스턴스화
  2. 일반화와 특수화
  3. 집합과 분해

분류와 인스턴스화

객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미한다.

소프트웨어에서 개념은 곧 타입이다. 따라서, 분류는 객체를 타입과 연관시키는 것이다.

분류의 역은 타입에 해당하는 객체를 생성하는 것으로 인스턴스화 라고 한다.

결론은, 분류는 객체와 타입간의 관계를 나타낸 것이다. 어떤 객체가 타입의 정의에 부합할 경우 그 객체는 해당 타입으로 분류되며 타입의 인스턴스가 된다.

타입

객체를 타입에 따라 분류하기 위해서는 객체가 타입에 속하는지 여부를 확인할 수 있어야 한다.

타입을 객체의 분류장치로서 적용할 수 있으려면 다음과같은 세가지 관점에서의 정의가 필요하다.

  • 심볼 : 타입을 가리키는 간단한 이름
  • 내연 : 타입의 완전한 정의. 내연의 의미를 이용해 객체가 타입에 속하는지 여부를 확인할 수 있다.
  • 외연 : 타입에 속하는 모든 객체들의 집합

객체가 동시에 여러 타입에 속할 수 있으면 다중 분류, 아니면 단일분류라 한다. 객체의 타입이 시간의 흐름에 따라 변화할 수 있다면 동적분류, 아니면 정적분류라 한다. 대부분의 언어는 단일분류와 정적분류만을 지원한다.

일반화와 특수화

일반화와 특수화에 대한 내용은 3장 정리에서 많이 했으니 생략하고 이번 부록에 등장한 것만 다루겠다.

두 타입이 일반화와 특수화 관계를 만족하려면 두 규칙을 준수해야 한다.

  • 100% 규칙 : 슈처타입의 정의가 100% 서브타입에 적용되어야만 한다. 서브타입은 속성과 연관관계면에서 슈퍼타입과 100%일치해야 한다.
  • Is - a 규칙 : 서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함되어야만 한다. 이는 대개 영어로 서브타입은 슈퍼타입이다 라는 구문을 만듦으로써 테스트 할 수 있다.

상속 과 일반화와 특수화

프로그램 내부에서 두 클래스 간에 상속 관계가 존재할 때 이 관계를 반드시 일반화 관계라고 할 수 없다. 즉, 상속은 일반화관계를 의미하지 않는다.

일반화의 원칙은 한타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응해야 한다는 것. 순응은 두가지 종류가 있다.

  • 구조적인 순응 : 타입의 내연과 관련된 100% 규칙을 의미한다. 예를 들어 Person이 name 속성을 가진다면, Person의 서브타입인 Employee도 역시 name을 속성으로 가져야 한다.
  • 행위적인 순응 : 타입의 행위에 관한 것이며, 서브타입은 슈퍼타입을 행위적으로 대체 가능해야 한다. 행위적인 순응을 흔히 리스코프 치환 원칙(LSP)이라고 한다. 예를 들어 Person이 getAge()라는 메시지에 대한 응답으로 나이를 반환한다면, 서브타입인 Employee 역시 getAge()라는 메시지에 대해 나이라는 응답을 반환해야 한다.

상속의 용도는 두가지다. 하나는 서브타이핑이고, 다른 하나는 서브클래싱이다.

  • 서브타이핑 : 서브클래스가 슈퍼클래스를 대체할 수 있는 경우 = 인터페이스 상속
  • 서브 클래싱 : 서브타이핑이 아닌 경우. 즉, 코드의 중복제거와 재사용을 목적으로 하는 상속 = 구현 상속

서브타이핑인지 여부를 확인할 유일한 방법은 클라이언트 관점에서 실제로 어떻게 사용하고 있는지 확인하는 것이다.

집합과 분해

집합은 불필요한 세부 사항을 배제하고 큰 그림에서 대상을 다룰 수 있게 한다. 즉, 불필요한 대상을 추상화 한다.

동시에 필요하다면 전체를 분해함으로써 그안에 포함된 부분들을 새로운 전체로 다룰 수 있다.

합성 관계

객체와 객체 사이의 전체 - 부분 관계를 구현하기 위해 사용한다. 합성관계는 부분을 전체 안에 캡슐화 함으로써 인지 과부하를 방지한다.

예를 들어 아래 모델을 보자.

합성관계 - 주문과 주문 항목은 합성관계로 연결되어 있다.

주문은 주문 항목을 포함한다. 주문 항목은 주문의 일부이므로 주문 항목과 관련된 세부 사항은 무시하고 주문과 상품만이 존재하는 것처럼 모델을 다룰 수 있다. 하지만, 필요하다면 언제든지 주문의 내부로 들어가 주문 항목과 관련된 세부 사항을 확인할 수 있다.

 

주문항목과 상품 사이에도 관계가 있다. 하지만, 어느것도 다른 것을 포함하지 않는다. 이런 관계를 연관관계라고 한다.

합성관계와 연관 관계의 차이는 합성 관계로 연결된 객체는 포함하는 객체가 제거될 때 내부에 포함된 객체도 제거되지만 연관관계는 독립적으로 한쪽이 삭제될 수있다.

패키지

관련성이 높은 클래스 집합을 논리적인 단위로 통합해 추상화 한 것이다. 이를 이용해 시스템의 전체적인 구조를 이해하기 위해 한번에 고려해야 하는 요소의 수를 줄일 수 있다.