Skip to content

Latest commit

 

History

History
172 lines (88 loc) · 7.46 KB

찬우.md

File metadata and controls

172 lines (88 loc) · 7.46 KB

이상한 나라의 객체

1장에서 객체지향은 현실 세계를 모방하는 것이 아니라 현실 서계를 기본으로 새로운 세계를 창조하는 것이라고 했다. 현실에서의 객체는 어떤 것일까?

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

  • 세상을 조금 더 간단하게 보기 위해서 구별하여 인지한다. 이상한 나라의 앨리스를 예제로 객체가 어떠한 특성을 가지는지 설명한다.

앨리스 객체

앨리스가 낮은 문을 통과하는 과정

  1. 병의 음료를 마시는 행동
  2. 키가 작아짐
  3. 낮은 문을 통과함

특정 시점의 앨리스의 상태란 특정 시점의 앨리스의 키를 의미한다.

📌 앨리스의 행동에 따라 앨리스의 상태가 변하게 된다.

  • 병의 음료를 마시는 행동으로 키가 170 → 120 으로 변경되었다.

📌 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.

  • 병의 음료를 마시는 행동이 50cm를 줄이는 것이라면
    • 170 → 120
    • 110 → 60

📌 행동의 성공여부는 이전에 어떤 행동들이 발생했는지에 따라 영향을 받는다. 즉, 행동 간의 순서가 중요하다.

  • 낮은 문을 통과하는 행동의 성공 여부는 병의 음료를 마시는 행동이 이전에 있었는지에 따라 달라진다.

📌 앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.

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

앨리스의 특징을 요약하면 아래와 같다.

  1. 앨리스는 상태를 가지며 상태는 변경 가능하다. → State
  2. 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다. → Behavior
    • 행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
    • 행동의 순서가 결과에 영향을 미친다.
  3. 앨리스는 어떤 상태에 있더라도 유일하게 식별 가능하다. → Identity

상태

행동의 성공여부는 이전에 어떤 행동들이 발생했는지에 따라 영향을 받는다. 그러나 일반적으로 과거에 발생한 행동의 이력을 통해 현재 발생한 행동의 결과를 판단하는 방법은 복잡하고 번거로우며 이해하기 어렵다.

  • 상태는 이전 행동들의 결과를 의미하기 때문에 상태를 이용한다면, 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.

    1. 병의 음료를 마시는 행동 (170 → 120)
    2. 낮은 문을 통과함 (120의 키를 가지고 통과여부 판단)
  • 단순한 값이 아니라 객체를 사용해서 다른 객체의 상태를 표현할 수 있다.

    • 앨리스가 현재 음료를 들고 있는 상태
    • 음료를 마신 이후의 문을 통과한 상태

📌 상태를 구성하는 특징을 프로퍼티라고 한다. 프로퍼티는 정적이며, 프로퍼티 값은 동적이다.

📌 객체와 객체 사이의 의미있는 연결을 링크라고 한다.

  • 이 링크를 통해서 객체 사이의 메시지가 전달 가능하다.
  • 다른 객체의 식별자를 알 수 있어야 한다.

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

객체는 자율적인 존재이다. 스스로의 상태를 책임져야한다. 객체는 스스로의 행동에 의해서만 상태가 변경되는 것을 보장함으로써 객체의 자율성을 유지한다.

여기서 행동이 등장한다.

행동

📌 행동은 객체 자신의 상태를 변경시킨다. 즉, 행동이 부수 효과를 초래한다는 것이다.

  • 병의 음료를 마시는 행동
    • 130 → 40
  • 낮은 문을 통과하는 행동
    • 통로 → 정원

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

객체는 책임을 위해 다른 객체와 협력을 수행한다. 이 때, 이전에 배웠던 것과 같이 객체는 메시지를 통해서만 의사소통을 할 수 있다. 메시지를 보내는 것도 “행동” 내에 포함된다.

  • 다른 객체의 상태를 직접 변경할 수 없다. → 객체의 자율성에 따라

  • 대신 메시지를 통해 다른 객체의 상태를 변경하는 행동을 유발시킬 수 있다.

    • 앨리스는 “음료를 마시는” 행동을 수행
      • 앨리스는 자신의 키 프로퍼티 값을 변경

    • 음료 객체에 “음료 양을 줄이는” 행동을 요청
    • 음료 객체는 “음료 양을 줄이는” 행동을 수행
      • 음료는 자신의 음료 양 프로퍼티 값을 변경

앨리스 객체는 음료 객체에 “음료 양을 줄이는” 행동을 요청만 하였을 뿐, 실제로 음료 양이 줄었는지 어떻게 줄었는지 전혀 알지 못한다.

📌 메시지 송신자는 메시지 수신자의 상태 변경에 대해서는 전혀 알지 못한다. 이 것이 캡슐화가 의미하는 것이다.

  • 책임을 다하기 위해 행동을 수행하는데, 이 때 행동을 어떻게 구현할 것인가 상태가 어떻게 변화하고 있는가를 외부에 노출하지 않는다. 이를 통해 객체는 자율성을 갖는다. 외부에서는 단순히 행동을 수행하도록 메시지만 보낼 수 있다.
  • 이를 통해 협력을 단순하고 유연하게 만든다. 이 것이 캡슐화를 해야하는 이유이다.

식별자

객체의 동일성은 상태가 아닌 식별자를 통해 결정한다.

📌 식별자를 기반으로 객체가 같은지를 판단할 수 있는 성질을 동일성이라고 한다.

기계로서의 객체

📌 객체에 접근할 수 있는 방법은 객체가 제공하는 행동 뿐이라는 것이다.

  • 객체의 상태를 조회하는 행동 → 쿼리
  • 객체의 상태를 변경하는 행동 → 명령

내부의 상태가 어떻게 변경되는지 알 수 없다.

행동이 상태를 결정한다.

📌 상태를 중심으로 객체를 바라보는 것은 객체지향에서 가장 쉽게 빠지는 함정이다.

  • 객체는 다른 객체와 협력하기 위해 존재한다. 그러므로 객체의 적합성을 결정하는 것은 상태가 아니라 객체의 행동이다.

은유와 객체

두 번째 도시전설

📌 객체지향을 현실세계의 추상화라고도 하는데, 그안에는 현실세계를 모방해서 단순화한다는 의미가 숨어있다.

  • 추상화란 실제의 사물에서 자신이 원하는 특성만 취하고 필요 없는 부분을 추려 핵심만 표현하는 행위를 말한다.

의인화

그러나 객체지향 세계는 현실 세계의 단순한 모방이 아니다. 현실속에서는 수동적인 존재가 소프트웨어 객체로 구현될 때는 능동적으로 변한다.

📌 이러한 소프트웨어 객체의 특징을 의인화라고 부른다.

  • 음료가 자신의 양을 줄인다.

은유

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

📌 창조한 객체의 특성을 상기시킬 수 있다면 현실 속의 객체의 이름을 이용해 객체를 묘사하라.

생각해볼만한 주제

  • 함수는 객체인가? → 함수는 상태가 존재하는가?