HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 아만드팀
[New] 아만드팀
/
🔏
팀 스터디
/
📕
객체지향의 사실과 오해
/
⚙️
부록A
⚙️

부록A

날짜
Jun 9, 2022
Tags
  • 부록A읽기 → 소챕터별로 나눠서 발표
    • notion image
notion image
 
분류와 인스턴스화개념과 범주타입외연과 집합클래스일반화와 특수화범주의 계층 / 서브타입 / 상속범주의 계층서브타입상속집합과 분해 계층적인 복잡성 합성관계 패키지

분류와 인스턴스화

개념과 범주

승용차, 버스, 트럭 ⇒ 자동차 길거리의 다양한 종류의 가로수 ⇒ 나무
  • 객체를 분류하고 범주로 묶는것은 특정 집합에 공통의 개념을 적용하는것을 의미함
  • 범주로 묶음으로써 복잡성을 낮출 수 있음
  • 어떤 객체가 타입의 정의에 부합 → 해당 타입으로 분류 → 타입의 인스턴스가 됨
 

타입

어떤 객체의 타입을 자동차라고 말할 수 있으려면 자동차에 대한 명확한 정의가 필요
  • 내연: 타입의 정의 ex) 원동기의 힘을 이용해 ~~ 운반하는 기계
  • 외연: 타입에 속하는 객체들의 집합 ex) 승용차, 버스, 트럭 묶음
  • 심볼: 타입을 가리키는 이름이나 명칭 ex) 자동차
 

외연과 집합

  • 단일 분류: 한 객체가 한 시점에 하나의 타입에만 속하는 것
  • 다중 분류: 한 객체가 한 시점에 여러 타입에 속할 경우
 
객체 지향 프로그래밍 언어들은 단일 분류만을 지원
→ 한 객체는 오직 한 클래스의 인스턴스여야만 한다. 두 개의 클래스의 인스턴스 X
 
  • 동적 분류: 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경 가능
  • 정적 분류: 객체가 자신의 타입을 변경할 수 없는 경우
 
다중 분류 + 동적 분류를 적용하는 것은 실세계 복잡성 모델링에 유용
but, 대부분의 언어는 클래스를 변경할 수 있는 방법을 제공하지 않음. 구현에 쉽지 않음
→ 디자인 패턴이 해당 방식을 적용한 것. 반드시 필요한 경우에만 사용
마틴파울러의 디자인 템플릿
 
다중 분류 + 동적 분류 관점에서 도메인 모델의 초안을 만든 후
단일 분류 + 정적 분류 방식으로 객체들의 범주를 재조정하자!
 

클래스

객체지향언어에서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것
동일한 범주에 속하는 객체는 동일한 클래스의 인스턴스여야함
동일란 범주에 속하는 객체는 모두 동일한 속성을 가지여만 한다.
 

일반화와 특수화

범주의 계층 / 서브타입 / 상속

범주의 계층

아리스토텔레스 - 동물의 발생
이전까지의 분류기법
notion image
notion image
린네의 분류
근대적인 분류기법
notion image

서브타입

객체지향 세계에서, 범주 = 개념 = 타입
어떤 타입이 다른 타입보다 일반적이라면 슈퍼타입 이라고 한다
어떤 타입이 다른 타입보다 좀 더 특수하다면 이 타입을 서브타입 이라고 한다
슈퍼타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화이다.
파편화된 사실을 모르더라도 복잡한 세상의 속성을 논리적으로 쉽게 이해할 수 있다.
  • 내연의 관점에서 일반화와 특수화는 → 범주간의 논리적인 추론을 가능하게 한다
  • 일반화의 특징을 이용하면 부분적인 사실을 통해 → 복잡한 사실에 대한 논리적인 추론이 가능

상속

일반화와 특수화 관계를 구현하는 가장 일반적인 방법 ⇒ 상속!
일반화의 원칙은 한 타입이 다른 타입의 서브타입이 되기 위해 슈퍼타입에 순응해야 한다.
순응
특정 기대 집합에 대해 서브타입의 슈퍼타입에 대한 대체가능성을 의미
  • 구조적인 순응
    • 속성과 연관관계에 관한 것
  • 행위적인 순응
    • 동일한 계약을 기반으로 하느냐에 관한 것
    • 흔히 리스코프 치환원칙 이라고 함
상속의 용도
  • 서브타이핑(subtyping)
    • 서브클래스가 슈퍼클래스를 대체할 수 있는 경우
    • 설계의 유연성이 목표
    • 인터페이스 상속
  • 서브클래싱(subclassing)
    • 서브클래스가 슈퍼클래스를 대체할 수 없는 경우
    • 코드의 중복 제거와 재사용
    • 구현 상속
모든 상속이 서브 타이핑이 아님
위임
여러 클래스로 구성된 상속 계층에서 수신된 메시지를 이해하는 기본적인 방법
계층내 어떤 클래스가 메시지를 처리하거나 최상위 부모 클래스에 위임될 때까지 계속됨
 

집합과 분해

계층적인 복잡성

  • 복잡성은 계층의 형태를 띈다.
  • 단순한 형태로부터 복잡한 형태로 진화하는 데 걸리는 시간은 그 사이에 존재하는 안정적인 형태의 수와 분포에 의존한다.
notion image
 
  • 안정적인 형태의 부분으로부터 전체를 구축하는 행위를 집합이라 한다.
  • 반대로 전제를 부분으로 분할하는 행위를 분해라고 한다.
  • 이러한 방식으로 집합을 이루어 생성된 계층 구조는 재귀적인 설계를 가능하게 한다.
재귀적인 설계란 무엇을 말하는 것일까?
 
  • 집합은 전체의 내부로 불필요한 세부 사항을 감춰주기 때문에 추상화 메커니즘인 동시에 캡슐화 메커니즘이다.
  • 집합은 한 번에 다뤄야 하는 요소의 수를 감소시킴으로써 인지 과부화를 방지한다.
 

합성관계

  • 객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성관계를 사용한다.
    • 부분을 전체안에 캡슐화 하여 인지 과부화 방지
    • 주문, 주문항목, 상품이 있다면 주문 안에 주문 항목의 존재를 일시적으로 감춰 복잡성을 낮춘다.
  • 연관관계 : 주문 항목과 상품 간에 관계
    • 상품은 주문 항목의 일부가 아니다.
  • 합성관계는 연관관계보다 객체를 더 강하게 결합한다.
    • 합성 관계는 포함하는 객체가 제거될 때 내부에 포함된 객체도 함께 삭제
    • 연관 관계는 독립적으로 제거
 

패키지

  • 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소 (모듈, 패키지)
  • 패키지는 내부에 포함된 클래스들을 감춤으로써 시스템의 구조를 추상화한다.