📖
Aaron's TECH BOOK
  • Intro
    • About me
  • Lecture
    • Kubernetes
      • Begin Kubernetes
    • Kafka
      • Begin Kafka
    • Kotlin
      • TDD, Clean Code Preview
      • woowa Kotlin
    • Java
      • Multithread Concurrency
      • The Java
    • Toby
      • Toby Spring 6
      • Toby Spring Boot
    • MSA
      • 01.Micro Service
      • 02.DDD 설계
      • 03.DDD 구현
      • 04.EDA 구현
    • Spring Boot
    • Spring Batch
    • Spring Core Advanced
    • Spring DB Part II
    • Spring DB Part I
    • JPA API and Performance Optimization
    • JPA Web Application
    • JPA Programming Basic
    • Spring MVC Part 2
      • 01.Thymeleaf
      • 02.ETC
      • 03.Validation
      • 04.Login
      • 05.Exception
    • Spring MVC Part 1
      • 01.Servlet
      • 02.MVC
    • Http
      • 01.Basic
      • 02.Method
      • 03.Header
    • Spring Core
    • Study
      • Concurrency issues
      • First Come First Served
      • Performance Test
      • TDD
      • IntelliJ
  • Book
    • Kafka Streams in Action
      • 01.카프카 스트림즈
      • 02.카프카 스트림즈 개발
      • 03.카프카 스트림즈 관리
    • Effective Kotlin
      • 01.좋은 코드
      • 02.코드 설계
      • 03.효율성
    • 이벤트 소싱과 MSA
      • 01.도메인 주도 설계
      • 02.객체지향 설계 원칙
      • 03-04.이벤트 소싱
      • 05.마이크로서비스 협업
      • 06.결과적 일관성
      • 07.CQRS
      • 08.UI
      • 09.클라우드 환경
    • 몽고DB 완벽 가이드
      • I. 몽고DB 시작
      • II. 몽고DB 개발
    • Kotlin Cookbook
      • 코틀린 기초
      • 코틀린 기능
      • ETC
    • Kotlin in Action
      • 함수/클래스/객체/인터페이스
      • 람다와 타입
      • 오버로딩과 고차 함수
      • 제네릭스, 애노테이션, 리플렉션
    • Kent Beck Tidy First?
    • 대규모 시스템 설계 기초
      • 01.사용자 수에 따른 규모 확장성
      • 02.개략적인 규모 추정
      • 03.시스템 설계 공략법
      • 04.처리율 제한 장치 설계
      • 05.안정 해시 설계
      • 06.키-값 저장소 설계
      • 07.유일 ID 생성기 설계
      • 08.URL 단축기 설계
      • 09.웹 크롤러 설계
      • 10.알림 시스템 설계
      • 11.뉴스 피드 시스템 설계
      • 12.채팅 시스템 설계
      • 13.검색어 자동완성 시스템
      • 14.유튜브 설계
      • 15.구글 드라이브 설계
      • 16.배움은 계속된다
    • 실용주의 프로그래머📖
    • GoF Design Patterns
    • 도메인 주도 개발 시작하기
      • 01.도메인 모델 시작하기
      • 02.아키텍처 개요
      • 03.애그리거트
      • 04.리포지터리와 모델 구현
      • 05.Spring Data JPA를 이용한 조회 기능
      • 06.응용 서비스와 표현 영역
      • 07.도메인 서비스
      • 08.애그리거트 트랜잭션 관리
      • 09.도메인 모델과 바운디드 컨텍스트
      • 10.이벤트
      • 11.CQRS
    • Effective Java 3/E
      • 객체, 공통 메서드
      • 클래스, 인터페이스, 제네릭
    • 소프트웨어 장인
    • 함께 자라기
    • Modern Java In Action
      • 01.기초
      • 02.함수형 데이터 처리
      • 03.스트림과 람다를 이용한 효과적 프로그래밍
      • 04.매일 자바와 함께
    • Refactoring
      • 01.리펙터링 첫 번째 예시
      • 02.리펙터링 원칙
      • 03.코드에서 나는 악취
      • 06.기본적인 리펙터링
      • 07.캡슐화
      • 08.기능 이동
      • 09.데이터 조직화
      • 10.조건부 로직 간소화
      • 11.API 리팩터링
      • 12.상속 다루기
    • 객체지향의 사실과 오해
      • 01.협력하는 객체들의 공동체
      • 02.이상한 나라의 객체
      • 03.타입과 추상화
      • 04.역할, 책임, 협력
      • 05.책임과 메시지
      • 06.객체 지도
      • 07.함께 모으기
      • 부록.추상화 기법
    • Clean Code
    • 자바 ORM 표준 JPA 프로그래밍
Powered by GitBook
On this page
  • 추상화 기법
  • 분류와 인스턴스화
  • 일반화와 특수화
  • 집합과 분해
  1. Book
  2. 객체지향의 사실과 오해

부록.추상화 기법

추상화 기법

  • 추상화는 도메인의 복잡성을 단순화하고 직관적인 멘탈 모델을 만드는 데 사용할 수 있는 가장 기본적인 인지 수단

  • 추상화 기법

    • 분류와 인스턴스화 :

      • 분류는 객체의 구체적인 세부 사항을 숨기고 인스턴스 간에 공유하는 공통적인 특성을 기반으로 범주를 형성하는 과정

      • 분류의 역은 범주로부터 객체를 생성하는 인스턴스화 과정

    • 일반화와 특수화 :

      • 일반화는 범주 사이의 차이를 숨기고 범주 간에 공유하는 공통적인 특성을 강조

      • 일반화의 역을 특수화

    • 집합과 분해 :

      • 집합은 부분과 관련된 세부 사항을 숨기고 부분을 사용해서 전체를 형성하는 과정

      • 집합의 반대 과정은 전체를 부분으로 분리하는 분해 과정

분류와 인스턴스화

개념과 범주

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

  • 개념이란 속성과 행위가 유사한 객체에 공통적으로 적용되는 관념이나 아이디어

  • 세상에 존재하는 객체에 개념을 적용하는 과정을 분류

  • 수많은 개별적인 현상들을 객체라고 하고, 하나의 개념을 타입이라고 한다.

  • 분류의 역은 타입에 해당하는 객체를 생성하는 과정 인스턴스화 or 예시

  • 분류는

    • 객체를 타입과 연관시키는 것

    • 객체들을 동일한 타입 또는 범주로 묶는 과정

    • 객체와 타입 간의 관계를 나타낸 것.

타입

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

  • 타입을 객체의 분류 장치로 적용하기 위한 정의

    • 심볼: 타입을 가리키는 간략한 이름이나 명칭

    • 내연: 타입의 완전한 정의, 내연의 의미를 이용해 객체가 타입에 속하는지 여부를 확인

    • 외연: 타입에 속하는 모든 객체들의 집합

외연과 집합

  • 단일 분류 : 한 객체가 한 시점에 하나의 타입에만 속하는 것

  • 다중 분류 : 한 객체가 한 시점에 여러 타입에 속할 경우

  • 동적 분류 : 객체가 한 집합에서 다른 집합의 원소로 자신이 속하는 타입을 변경할 수 있을 경우

  • 정적 분류 : 객체가 자신의 타입을 변경할 수 없는 경우

다중 분류와 정적 분류 방식으로 객체들의 범주를 재조정하는 편이 분석과 구현 간의 차이를 메울 수 있는 가장 현실적인 방법 단순함을 위해서는 항상 다중 분류와 동적 분류보다는 단일 분류와 정적 분류를 선택하는 것이 현명

클래스

일반화와 특수화

범주의 계층

  • 계층의 상위에 위치한 범주를 계층의 하위에 위치한 범주의 일반화라고 하고,

  • 계층의 하위에 위치한 범주는 계층의 상위에 위치한 범주의 특수화라고 한다.

서브타입

  • 어떤 타입이 다른 타입보다 일반적이라면 슈퍼타입

  • 어떤 타입이 다른 타입보다 좀 더 특수하다면 서브타입

  • 슈퍼 타입은 서브타입의 일반화이고, 서브타입은 슈퍼타입의 특수화

  • 100% 규칙 : 슈퍼타입의 정의가 100% 서브타입에 적용돼야 한다.

    • 서브타입은 속성과 연관관계 면에서 슈퍼타입과 100% 일치

  • is-a 규칙 : 서브타입의 모든 인스턴스는 슈퍼타입 집합에 포함돼야 한다.

  • is-a-kind-of : 서브타입이 슈퍼타입 정의를 확장하는 경우

상속

  • 일반화의 원칙은 한 타입이 다른 타입의 서브타입이 되기 위해서는 슈퍼타입에 순응해야 한다

    • 구조적인 순응 : 타입의 내연과 관련된 100% 규칙을 의미한다.

    • 행위적인 순응 : 타입의 행위에 관한 것. 서브타입은 슈퍼타입의 행위적으로 대체 가능해야 한다.

  • 상속의 용도

    • 서브타이핑 : 서브클래스가 슈퍼클래스를 대체할 수 있는 경우 (유연성이 목표)

      • 인터페이스 상속(Interface inheritance)이라고 불림

      • 특정 기대 집합에 대한 서브타입과 슈퍼타입 간의 구조적, 또는 행위적 순응 관계

      • 대체 가능성을 내포

    • 서브클래싱 : 서브클래스가 슈퍼클래스를 대체할 수 없는 경우 (코드 중복 제거와 재사용 목적)

      • 구현 상속(Implementation inheritance)이라고 불림

      • 서브클래스가 슈퍼클래스를 대체할 수 없고 단지 코드만 공유하고 있다면 서브클래싱

집합과 분해

계층적인 복잡성

  • 집합 : 안정적인 형태의 부분으로부터 전체를 구축하는 행위

    • 불필요한 세부 사항을 추상화

  • 분해 : 전체를 부분으로 분할하는 행위

합성 관계

  • 객체와 객체 사이의 전체-부분 관계를 구현하기 위해서는 합성 관계를 사용

  • 일반적으로 합성 관계로 연결된 객체는 포함하는 객체가 제거될 때 내부에 포함된 객체도 함께 제거

  • 연관 관계로 연결된 두 객체는 생명주기와 관련된 어떤 제약도 부과하지 않는다.

  • 합성 관계는 생명주기 측면에서 연관 관계보다 더 강하게 객체들을 결합한다.

패키지

  • 소프트웨어의 전체적인 구조를 표현하기 위해 관련된 클래스 집합을 하나의 논리적인 단위로 묶는 구성 요소를 package or module

  • 시스템의 전체적인 구조를 이해하기 위해 한 번에 고려해야 하는 요소의 수를 줄일 수 있음

  • 개별 클래스가 아닌 클래스의 집합을 캡슐화함으로써 전체적인 복잡도를 낮출 수 있음

Last updated 1 year ago