본문 바로가기
Book Record

[객체지향의 사실과 오해] Chapter2. 이상한 나라의 객체

by 그냥팬더 2021. 4. 20.
반응형

02. 이상한 나라의 객체

객체지향과 인지 능력

  • 객체지향은 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 인지 능력에 기반을 두고 있다.
  • 인간의 인지 능력은 물리적인 경계를 넘어 개념적으로 경계를 지을 수 있다.

객체, 그리고 이상한 나라

앨리스 객체

  • 행동에 따라 상태가 변한다.
  • 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태다.
    • 따라서, 행동의 결과는 상태에 의존적이다.
  • 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다.
    • 행동 간의 순서의 중요성을 의미한다.
  • 행동에 의해 상태가 변경되더라도, 객체는 유일한 존재로 식별 가능하다.

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

  • 객체: 상태, 행동, 식별자를 지닌 실체로 보자.

상태(State)

  • 어떤 행동의 결과는 과거에 어떤 행동들이 일어났었느냐에 의존한다.
  • 행동의 과정과 결과를 단순하게 기술하는 상태.
  • 값들은 객체가 아니라, 객체의 상태를 표현하기 위해 사용된다.
    • 때로는 객체로 상태를 나타내기도 한다.
  • 객체의 상태를 구성하는 모든 특징을 프로퍼티라고 한다.
    • 변경되지 않고 고정되기 때문에 정적이다.
    • 하지만 프로퍼티 값은 시간에 따라 변하므로 동적이다.

프로퍼티의 두 종류

  • 링크: 객체와 객체 사이의 의미있는 연결
  • 속성: 객체를 구성하는 단순한 값

행동(Behavior)

  • 객체의 상태는 저절로 변하지 않는다.
    • 자발적인 행동에 의해 변한다.
  • 행동은 자신의 상태를 변경시킨다. (부수 효과)

상태와 행동사이의 관계

  • 객체의 행동은 상태에 영향을 받는다.
    • 상호작용이 현재의 상태에 어떤 방식으로 의존하는가
  • 객체의 행동은 상태를 변경시킨다.
    • 상호작용이 어떻게 현재의 상태를 변경시키는가
  • 객체 공동체에 참여하기 위해 다른 객체와 적극적으로 상호작용한다.
    • 다른 객체에 요청을 하는 것(메시지)
    • 자기 자신의 상태 혹은 다른 객체의 상태 변경을 유발한다.
  1. 객체 자신의 상태 변경
  2. 행동 내에서 협력하는 다른 객체에 대한 메세지 전송

캡슐화

  • 현실 객체는 능동적일 수 있으나, 객체지향에서는 모든 객체는 스스로 관리하는 자율적인 존재다.
  • 따라서, 외부에서 자신의 상태를 변경할 수 없다.
    • 자신의 상태 변경은 자기 스스로의 몫이다.
  • 메시지를 송신한 객체는 수신한 객체의 상태 변경에 대해서는 전혀 알지 못한다.
  • 상태는 내부에 감추고, 행동만 노출시킴으로 자율성을 높인다.
    • 자율성이 높은 객체는 스스로 결정하기 때문에 객체의 지능도 높아진다.
    • 지능이 높아질수록 협력은 유연하고 간결해진다.

식별자(Identity)

  • 객체가 식별 가능하다. -> 객체를 구별할 수 있는 특정한 프로퍼티가 객체안에 존재한다.
  • 식별자란 그 특별한 프로퍼티를 의미한다.
    • 반대로 객체가 아닌 단순한 값은 식별자를 갖지 않는다.

값(Value)

  • 변하지 않는 양을 모델링 한다.
  • 상태는 변하지 않기 때문에 불변 상태를 가진다.
    • 두 인스턴스의 상태가 같다면, 두 인스턴스를 같은 것으로 판단한다.
  • 이처럼 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성이라고 한다.
  • 상태를 기준으로 동등성을 판별하기 때문에 식별자가 필요하지 않다.

객체(Object)

  • 시간에 따라 변경되는 상태를 포함한다.
  • 상태가 변하기 때문에 가변 상태를 가진다.
    • 두 객체의 상태가 같더라도, 두 객체는 독립적인 별개의 객체로 다룬다.
    • 이름이 같다고 같은 객체가 아니다.
  • 상태와 무관하게 두 객체를 동일하거나 다르다고 판단할 수 있는 프로퍼티를 가진다.
  • 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성이라고 한다.
  • 상태를 기준으로 판단할 수 없는 이유는 시간의 흐름에 따라 객체의 상태가 변하기 때문이다.

값 != 객체

  • 객체를 의미하는 다양한 용어들(식별자를 가진)
    • 참조 객체
    • 엔티티
  • 값을 의미하는 용어(식별자가 없는)
    • 값 객체

행동이 상태를 결정한다

  • 초보자: 객체에 필요한 상태가 무엇인지를 결정하고, 그 상태에 필요한 행동을 결정
  • 하지만 이 경우 설계에 나쁜 영향을 끼친다.
    • 상태를 먼저 결정할 경우, 캡슐화가 저해된다.
      공용 인터페이스에 그대로 노출된다.
    • 객체를 협력자가 아닌 고립된 섬으로 만든다.
      객체는 다른 객체와 협력하기 위해 필요하다.
    • 객체의 재사용성이 저해된다.
  • 협력에 참여하는 객체는 상태가 아니라 행동에 초점
    • 행동을 결정하고, 행동에 필요한 정보가 무엇인지 고려하는 설계
  • 협력 안에서의 행동은 결국 객체가 완수해야하는 책임
    • 책임 주도 설계(Responsibility-Driven Design, RDD)

은유와 객체

  • 객체지향을 현실 세계의 추상화(자신이 원하는 특성만 취한다)
    • 현실을 간추려 핵심만 표현하는 것.(아니다)

의인화

  • 현실 속에서는 수동적인 존재가, 소프트웨어 세계에서는 능동적
    • 현실보다 더 많은 것을 할 수 있는 소프트웨어 내의 객체

은유

  • 현실 속의 객체의 의미 일부는 소프트웨어 객체로 전달된다.
    • 소프트웨어의 객체는 현실 속의 객체의 은유다.
  • 표현적 차이와 의미적 차이라는 논점
    • 차이는 소프트웨어에 대해 사람들이 생깍하는 모습과 실제 소프트웨어의 표현 사이의 차이
    • 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용한다면 구조를 쉽게 예측한다.
      • 즉, 이해하기 쉽고, 유지보수가 용이한 소프트웨어를 만든다.

이상한 나라를 창조하라

  • 우리의 목적은 현실을 모방하는 것이 아니라, 나만의 소프트웨어 세계를 창조하는 것
반응형

댓글