📖
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. 객체지향의 사실과 오해

02.이상한 나라의 객체

객체지향과 인지 능력

  • 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.

  • 소프트웨어의 세계는 인간이 인지할 수 있는 다양한 소프트웨어 객체들이 모여 이뤄져 있다.

객체, 그리고 이상한 나라

  • 앨리스의 특징

    • 상태를 가지며 상태는 변경 가능

    • 앨리스의 상태를 변경시키는 것은 앨리스의 행동

      • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술 가능

      • 행동의 순서가 결과에 영향을 미침

    • 어떤 상태에 있더라도 유일하게 식별 가능

객체, 그리고 소프트웨어 나라

  • 객체의 다양한 특성을 효과적으로 설명하기 위해서는 객체를 상태(state), 행동(behavior), 식별자(identity)를 지닌 실체로 보는 것이 가장 효과적

  • 이상한 나라의 앨리스는 상태, 행동, 식별자를 지닌 실체다.

객체란?
식별 가능한 개체 또는 사물이다.
      - 객체는 자동차처럼 구체적인 사물일 수도, 시간처럼 추상적인 개념일 수도 있다.
      - 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.

상태

  • 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다.

  • 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

  • 객체의 상태를 구성하는 모든 특징을 통틀어 객체의프로퍼티라고 한다.

    • 프로퍼티는 변경되지 않고 고정되어 정적이다.

    • 반면 프로퍼티 값은 시간이 프름에 따라 변경되기 때문에 동적이다.

  • 객체와 객체 사이의 의미 있는 연결을 링크(link)라고 한다.

    • 객체의 링크를 통해서만 메시지를 주고 받을 수 있다.

    • 링크는 객체가 다른 객체를 참조할 수 있다는 것을 의미

    • 한 객체가 다른 객체의 식별자를 알고 있는 것으로 표현

  • 객체를 구성하는 단순한 값은 속성(attribute)

  • 객체의 프로퍼티는 단순한 값인 속성과 다른 객체를 가리키는 링크라는 두 가지 종류의 조합으로 표현할 수 있다.

객체의 상태란?
특정 시점에 객체가 가지고 있는 정보의 집합으로 객체의 구조적 특징을 표현한다.
	- 객체에 존재하는 정적인 프로퍼티와 동적인 프로퍼티 값으로 구성
	- 객체의 프로퍼티는 단순한 값과 다른 객체를 참조하는 링크로 구분
  • 행동은 다른 객체로 하여금 간접적으로 객체의 상태를 변경하는 것을 가능하게 한다.

  • 객체지향의 기본 사상은 상태와 상태를 조작하기 위해 행동을 하나의 단위로 묶는 것!

  • 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지

행동

상태와 행동

  • 객체의 행동은 객체의 상태를 변경시키지만 행동의 결과는 객체의 상태에 의존적이다.

  • 상태와 행동 사이의 관계

    • 객체의 행동은 상태에 영향을 받는다.

    • 객체의 행동은 상태를 변경시킨다.

  • 상태의 개념을 이용해 행동을 서술

    • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가

    • 상호작용이 어떻게 현재의 상태를 변경시키는가

  • 객체는 다른 객체와 적극적으로 상호작용하며 협력하는 객체들의 공동체에 참여하기 위해 노력한다.

협력과 행동

  • 객체의 행동으로 인해 발생하는 결과

    • 객체 자신의 상태 변경

    • 행동 내에서 협력하는 다른 객체에 대한 메시지 전송

행동이란?
외부의 요청 또는 수신된 메시지에 응답하기 위해 동작하고 반응하는 활동이다.
	- 행동의 결과로 객체는 자신의 상태를 변경하거나 다른 객체에세 메시지를 전달할 수 있다.
	- 객체는 행동을 통해 다른 객체와의 협력에 참여하므로 행동은 외부에 가시적이어야 한다.

상태 캡슐화

  • 객체는 상태를 캡슐 안에 감춰둔 채 외부로 노출하지 않는다.

  • 객체가 외부에 노출하는 것, 외부에서 객체에 접근할 수 있는 것은 행동뿐이다.

  • 상태를 잘 정의된 행동 집합 뒤로 캡슐화하는 것은 객체의 자율성을 높이고 협력을 단순하고 유연하게 만든다.

식별자

  • 객체를 서로 구별할 수 있는 특정한 프로퍼티(식별자)가 객체 안에 존재한다.

  • 값(value)은 불변 상태(immutable state) , 객체는 가변 상태(mutable state)

  • 동등성(equality) : 상태를 이용해 두 값이 같은지 판단할 수 있는 성질

  • 동일성(identical) : 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질

식별자란?
어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티
	- 값은 식별자를 가지지 않기 때문에 상태를 이용한 동등성 검사를 통해 두 인스턴스를 비교해야 한다.
	- 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.

객체의 특성

객체는 상태를 가지며 상태는 변경 가능하다. 객체의 상태를 변경시키는 것은 객체의 행동이다.

  • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.

  • 행동의 순서가 실행 결과에 영향을 미친다. 객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.

기계로서의 객체

  • 일반적으로 객체의 상태를 조회하는 작업을 Query

  • 객체의 상태를 변경하는 작업을 Command 라고 한다.

  • 객체를 기계로서 바라보는 관점은 상태, 행동, 식별자에 대한 시각적인 이미지를 제공하고 캡슐화와 메시지를 통한 협력 관계를 매우 효과적으로 설명한다.

행동이 상태를 결정한다.

  • 상태를 먼저 결정하고 행동을 나중에 결정하는 방법은 설계에 나쁜 영향을 끼친다.

    1. 상태를 먼저 결정할 경우 캡슐화가 저해된다

    2. 객체를 협력자가 아닌 고립된 섬으로 만든다.

    3. 객체의 재사용성이 저하된다.

  • 협력에 참여하는 훌륭한 객체 시민을 양성하기 위한 가장 중요한 덕목은 상태가 아니라 행동에 초점을 맞추는 것!

  • 객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.

  • 객체의 행동을 결정하고 그 후에 행동에 적절한 상태를 선택하자.

은유와 객체

의인화

  • 현실 속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다.

    • 현실 객체가 가지지 못한 추가적인 능력을 보유하게 된다.

  • 객체지향 세계는 현실의 모습을 조금 참조할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것이다.

  • 객체지향의 세계는 현실의 추상화가 아니다. 객체지향 세계의 거리는 현실 속의 객체보다 더 많은 특징과 능력을 보유한 객체들로 넘쳐난다,

은유

  • 현실 속의 객체의 의미 일부가 소프트웨어 객체로 전달되기 때문에 프로그램 내의 객체는 현실 속의 객체에 대한 은유다

  • 현실 세계인 도메인에서 사용되는 이름을 객체에게 부여하자.

현실 속의 객체의 이름을 이용해 객체를 묘사하고 우리들 만의 새로운 세계를 창조해보자.

Last updated 1 year ago