study with book

[객체지향의 사실과 오해] 2. 이상한 나라의 엘리스

yjs3819 2021. 7. 17. 17:56
728x90

아기들을 포함한 세상 사람들은 세상을 뚜렷한 경계를 가진 객체들의 집합으로 바라본다.

객체지향과 인지 능력

객체란 인간이 분명하게 인지하고 구별할수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것이다.
하지만 실세계와 소프트웨어 세계의 객체의 유사성은 여기까지이다.

실세계의 객체는 사람의 도움없이 스스로 무언가를 할 수 없다.
소프트웨어 세계의 객체는 스스로 무언가를 할수 있다. 즉, 자율적이다.

객체, 그리고 이상한 나라

이상한 나라의 엘리스 이야기를 생각하며 객체란 무엇인지 알아보자

엘리스는 음료수를 마시면 키를 변경할수 있다. -> 엘리스는 키를 가지고있으며 상태를 변경가능
음료수를 마시면 키가 변경한다 -> 엘리스는 음료수를 마시는 행동을 했고 행동을 통해서 상태가 변경
음료수 마시기전 키가 130 이면 음료수를 마신뒤의 키는 100 이다. -> 행동의 결과는 상태에 의존적이다.
키를 작게하려면 키를 작게하는 과거의 행동들이 필요하다,(버섯먹기, 음료수먹기..) -> 행동의 순서가 결과에 영향을 미친다.
키가 200이든 키가 100이든 엘리스는 엘리스이다. -> 엘리스가 어떤 상태에 있더라도 유일하게 식별가능하다.

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

앞에서 엘리스와 소프트웨어나라의 객체를 연결시켜보자.

객체란 식별가능한 개체 또는 사물이다. 객체는 구체적일수도 추상적일수도있다. 객체를 상태, 행동, 식별자를 가지고 있다.

객체는 상태, 행동 식별자를 가진 개체이다.

상태

상태는 과거의 일련의 행도의 순서를 알지 못해도 현재의 상태만 알면 행동의 결과를 쉽게 예측할수 있다. 그렇기에 상태는 되게 중요하다.
즉, 상태는 세상의 복잡성을 완화하고 인지 과부하를 줄일수 있는 중요한 개념이다.

  • 상태와 프로퍼티
    객체가 가지고있는 상태를 나타낼수 있는 특징을 프로퍼티라고한다.
    프로퍼티는 단순한 값일수도, 다른 객체일수도있다.
    여기서 단순한 값을 어트리뷰트라고하며
    다른 객체를 링크라고한다.

객체의 상태 나타내는특징 : 프로퍼티
상태를 나타내는 단순한 값 : 어트리뷰트(정적인 프로퍼티)
상태를 나타내는 객체 : 링크(동적인 프로퍼티)

행동

  • 상태와 행동
    상태는 객체의 행동을 통해서 변한다.
    행동의 결과는 상태에 의존적이다.(상태를 이용하면 복잡한 행동의 결과를 쉽게 알수 있다.)

  • 협력과 행동
    메시지가 수신되면 행동이 유발된다.
    객체는 다른 객체와 협력을 할때 의미가 있다.
    객체가 협력하는 유일한 방법은 행동이다.

객체는 행동을 하며 협력에 참여하고 그 결과로 자신의 상태를 변경한다.

객체가 협력에 참여하는 과정 즉, 행동을 할 때 행동은 두가지 side effect를 일으킨다.

  1. 객체 자신의 상태를 변경
  2. 다른 객체에 대한 메시지 전송(행동 내에서 협력하는 다른 객체, 즉 수신자)

행동으로 객체는 협력에 참여하므로 외부에 가시적이여야한다.

  • 상태 캡슐화
    소프트웨어 세상의 객체는 능동적인 자율적인 존재라는 것이다.
    협력내의 다른 객체에게 메시지를 전송해도 수신하는 수신자 객체의 상태가 변경할지 말지에 대한 여부는 수신자 객체가 스스로 결정한다.
  • --> 메시지를 전송하는 객체는 메시지 수신하는 객체의 상태가 변할지 말지는 아애 모른다.

이것이 캡슐화이다.

캡슐화 : 메시지를 전송하는 객체는 메시지를 수신하는 객체의 상태가 변할지 못할지를 아애 알지를 못한다. 상태가 변할지 말지 결정하는것은 수신하는 객체이다. 협력내에서 외부에 노출되는것은 행동뿐이다. 상태는 캡슐내에 감추어져 있다.

캡슐화는 객체의 자율성을 높인다. 객체의 자율성이 높으면 객체는 스스로 결정하고 판단하기에 객체는 지능이 높아진다. 객체가 지능이 높아지면 객체간의 협력은 유연해지고 간결해진다.

식별자

객체는 서로 구별할수있는 어떠한 프로퍼티를 가지고있다. 이 프로퍼티를 식별자라고한다.

단순한 값 : 식별자 없다(단순한 값은 불변이므로 변하지않기에 식별자가 필요가없음) - 상태가 같은지를 이용해 값이 같은지 판단 : 동등성
객체 : 식별자 있다(시간에 따라 변하기 때문에 유일하게 식별할수있는 프로퍼티 즉, 식별자가 있다.) - 식별자가 같은지를 이용해 같은 객체인지 판단 : 동일성

엘리스를 객체로(in sw)

  • 객체는 상태를 가지며 변경 가능하다.
  • 객체의 상태를 변경시키는 것은 객체의 행동이다.
    • 행동의 결과는 상태에 의존적이다.
    • 행동의 순서가 실행 결과에 영향을 미친다.
  • 객체는 어떤 상태에 있더라도 식별 가능하다.(식별자로)

기계로서의 객체

객체지향 세계에서 개발자가 하는 주된 업무 두가지

  1. 객체의 상태 조회 : 쿼리
  2. 객체의 상태 변경 : 명령

객체를 기계로 비유하여 한번더 객체에 대해서 이해하자.

  • 기계의 상태변경이나 상태조회를 위해 버튼을 '띡'하고 눌러도 전달된 이 메시지에 따라 스스로 판단하고 결정하는것은 기계이다. (기계와 객체는 자율성을 가짐)
  • 버튼을 통해서만 쿼리와 명령을 할수있다. 이는 객체가 제공하는 행동을 통해서 유일하게 객체에 접근할수 있다. 직접 기계 내부의 상태에 접근하지 않는다.(행동을 통해서 상태를 변경, 직접 상태를 변경하려고 하지 않는다.)
  • 두 기계의 상태가달라도 두 기계는 다른 기계다(식별자를 가진 기계와 객체)
  • 두 기계가 링크로 연결되어있다면 메시지를 통해서 협력을한다.(객체들간 메시지를 통해서 행동을 유발하고 행동을 통해 협력을 한다.)

행동이 상태를 유발한다.

객체의 상태에 집착하지 마라! 행동에 집착하라.

객체들간의 협력은 객체의 행동으로 실현된다. (객체의 협력은 시스템의 기능 구현을 이룬다.)
그렇기에 객체를 설계할 때 가장먼저 고민해야할부분은 상태가 아닌 행동이다.

협력안에서 객체의 행동은 객체가 완수해야할 책임을 의미한다. -> 객체에게 어떠한 책임이 필요할까를 결정하는 과정이 전체 설계를 주도해야한다. = 책임-주도설계(RDD)

행동이 상태를 결정한다. - 기억해야할 문장

은유와 객체

sw세계의 객체는 능동적이다.(살아있다. 생명이있다.)
즉, 실세계의 객체보다 더 많은일을 할수있다. - 의인화

그러나 !!!
실세계 객체와 sw세계의 객체는 은유를 통해서 둘간의 표현적 차이를 줄이는 것도 나쁘진않다.
이를 통해 sw세계의 구조를 쉽게 예측가능(즉,유지보수 good, 이해 good)

객체지향 설계자로서 현실을 모방하는게아니라 이상한나라를 창조하라. 어떠한 제약도 없다. 현실 속의 객체를 은유를 이용할 필요가 있다면 사용하되 그렇지 않다면 아애 새로운 세계를 창조하라.

728x90