스터디/자바

[객체지향의 사실과 오해] 부록 - 추상화 기법

gmelon 2023. 4. 10. 18:38

추상화 기법

  • 추상화 -> 도메인의 복잡성을 단순화하고 직관적 멘탈 모델을 만드는 데 사용할 수 있는 가장 기본적인 인지 수단
    • 추상화 기법들은 복잡성을 낮추기 위해 사물의 특정한 측면을 감춘다
    • 동일한 추상화 기법을 프로그램의 분석, 설계, 구현 단계에 걸쳐 일관성 있게 적용할 수 있다는 것이 객체지향이 갖는 장점

1. 분류와 인스턴스화

개념과 범주

  • 객체를 분류하고 범주로 묶는 것은 객체들의 특정 집합에 공통의 개념을 적용하는 것을 의미함
  • 분류 -> 세상에 존재하는 객체에 개념(타입)을 적용하는 과정
    • 즉, 객체를 타입(개념)과 연관시키는 것

타입

  • 객체가 타입에 속하는지 검증하기 위해 필요한 타입의 정의 3가지
    • 심볼(타입의 이름), 내연(타입의 정의), 외연(타입에 속하는 객체들의 집합)

외연과 집합

  • 외연은 집합과 동일한 개념임
  • 객체는 여러 집합(외연)에 동시에 포함될 수 있다(다중 분류)
    • 또한 시간에 따라 타입이 바뀌는 동적 분류도 존재
    • 하지만 대부분의 객체지향 언어는 단일 분류 + 정적 분류만 지원 하므로 이를 개념적 수준을 넘어 구현으로 옮기기는 어렵다
  • 따라서 현실적으로는 도메인 모델을 작성할 땐 개념적으로 다중 + 동적 분류 관점에서 모델을 작성하고 이후에 구현에 적합하도록 객체들의 범주를 수정하는 방법을 제안하고 있음

클래스

  • 클래스를 통해 '타입'을 구현할 수 있음
    • 즉, 클래스와 타입은 동일한 개념이 아님
    • 추상 클래스나 인터페이스 등을 통해서도 타입을 구현할 수 있음
  • 클래스는 객체가 공유하는 본질적인 속성을 정의한다
    • 우연적(본질적이지 않은) 속성은 표현할 수 없다

2. 일반화와 특수화

범주의 계층

  • 더 세부적인 하위 계층 범주는 상위 계층 범주에 속함
    • 하위 계층 범주를 상위 계층 범주의 특수화,
    • 상위 계층 범주를 하위 계층 범주의 일반화라고 함

서브타입

  • 서브타입은 슈퍼타입의 본질적인 속성을 모두 포함하기 때문에 계층에 속하는 모든 서브타입들이 슈퍼타입의 속성을 공유한다는 것을 쉽게 예상할 수 있다.
  • 어떤 타입이 다른 타입의 서브 타입이 되기 위해선 아래 두 가지 규칙을 만족해야 한다
    1. 100% 규칙 - 슈퍼타입의 정의가 100% 서브타입에 적용되어야 한다. 서브타입의 속성과 연관관계가 슈퍼타입과 100% 일치해야 한다 (내연의 관점)
    2. Is-a 규칙 - 서브타입이 슈퍼타입의 부분집합이어야 한다 (외연의 관점)

상속

  • 일반화 - 특수화 관계를 구현하는 가장 일반적인 방법
    • 하지만, 모든 상속 관계가 일반화 관계는 아니다
  • 서브타입이 슈퍼타입에 순응해야만 일반화 관계가 성립한다 (대체 가능성과 연관)
    • 구조적인 순응 - 슈퍼타입의 속성과 연관관계를 서브타입도 동일하게 가질 것 (100% 규칙)
    • 행위적인 순응 - 리스코프 치환 원칙을 만족할 것. 즉, 동일한 메서드에 대해 동일한 (행위적인 관점에서) 응답을 가질 것.
  • 일반화 관계가 성립할 땐 서브 타이핑이라 하고, 그렇지 않을 땐 서브 클래싱이라 칭한다
    • 서브 클래싱은 단순 코드 중복 방지나 공통 코드 재활용 등으로 상속이 활용되는 경우를 말한다
  • 가능한 모든 상속 관계가 서브 파이핑의 대체 가능성을 준수하도록 해야 코드의 유연성 & 재사용성이 높아진다

3. 집합과 분해

계층적인 복잡성

  • 집합의 가치는 많은 수의 사물들의 형상을 하나의 단위로 다룸으로써 복잡성을 줄일 수 있다는 데 있다
    • 필요한 시점에는 전체를 분해하여 부분을 새로운 전체로 다룰 수도 있다
    • 전체와 부분 간의 일관된 계층 구조는 재귀적 설계를 가능하게 한다
  • 집합은 추상화인 동시에 캡슐화 매커니즘이다
    • 한번에 다뤄야 하는 요소의 수를 감소시킴으로써 인지 과부하를 방지한다

합성 관계

  • 객체와 객체 사이의 전체-부분 관계를 구현하기 위해 합성 관계를 사용
    • ex) 주문 - 주문 상품 (주문 상품은 주문과 별개로 존재할 수 없음)
  • 주문 상품은 주문 안에 속하므로 주문과 다른 객체와 관계를 맺을 때 다른 객체는 주문 상품을 고려하지 않고 주문만 존재하는 것처럼 생각할 수 있다 -> 복잡성 완화
  • 포함되지 않고 그냥 관계가 존재할 때는 이를 연관 관계라고 한다

패키지

  • 서로 관련성이 높은 클래스 집합을 논리적인 단위로 통합할 때 사용하는 단위
  • 함께 협력하는 응집도 높은 클래스 집합을 하나의 패키지를 통해 모아 시스템의 구조를 추상화할 수 있다

이 게시글은 스터디에서 [ 객체지향의 사실과 오해 / 조영호 ] 책을 읽고 중요한 내용을 잊지 않기 위해 정리한 게시글입니다. 요약 및 생략된 내용이 많고 제가 이해한 대로 다시 정리한 내용이라 보다 자세하고 정확한 설명은 책 구매를 권장합니다.