객체지향의 사실과 오해 - 2장

HyeBin, Park·2022년 6월 2일
0
post-thumbnail

객체지향의 사실과 오해 - 2장

2. 이상한 나라의 객체

객체지향 패러다임은 지식을 추상화하고 추상화한 지식을 객체 안에 캡슐화함으로써 실세계 문제에 내재된 복잡성을 관리하려고 한다. 객체를 발견하고 창조하는 것은 지식과 행동을 구조화하는 문제다. - 레베카 워프스브록

🥦 객체지향과 인지 능력

  • 인간은 본능적으로 세상을 독립적이고 식별 가능한 객체의 집합으로 바라본다.
  • 객체지향이 세상을 자율적이고 독립적인 객체들로 분해할 수 있는 인간의 기본적인 인지 능력에 기반을 두고 있다.
  • 인간은 단순한 객체들로 주변을 분해함으로써 자신이 몸담고 있는 세상을 이해하려고 노력한다.
    => 객체란 인간이 분명하게 인지하고 구별할 수 있는 물리적인 또는 개념적인 경계를 지닌 어떤 것

👩 앨리스 객체

  • 앨리스는 음료나 케이크를 먹으면 키가 달라진다.
    => 앨리스는 상태를 가지며 상태는 변경 가능하다.

  • 앨리스의 상태를 변경시키는 것은 앨리스의 행동이다.
    => 앨리스의 상태를 결정하는 것은 행동이지만, 행동의 결과를 결정하는 것은 상태다.
    => 앨리스가 한 행동의 결과는 앨리스의 상태에 의존적이다.

  • 앨리스의 키에 따라 위치가 달라진다.
    => 어떤 행동의 성공 여부는 이전에 어떤 행동들이 발생했는지에 영향을 받는다.

  • 앨리스는 문을 통과하기 전에 먼저 키를 작게 줄이기 위해 병 안의 음료나 케이크를 먹어야한다.
    => 행동 간의 순서가 중요하다.

  • 모든 상태가 변경되더라도 앨리스가 앨리스 라는 사실은 변하지 않는다.
    => 앨리스는 상태 변경과 무관하게 유일한 존재로 식별 가능하다.

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

  • 객체는 상태, 행동, 식별자를 지닌 실체로 보는 것이 가장 효과적이다.

  • 객체란 식별 가능한 개체 또는 사물이다. 구체적인 사물일 수도 있고, 추상적인 개념일 수도 있다.

  • 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가진다.

  • 소프트웨어 안에서 객체는 저장된 상태와 실행 가능한 코드를 통해 구현된다.

🎃 상태

  • 상태를 사용하면 과거의 모든 행동 이력을 설명하지 않고도 행동의 결과를 쉽게 예측하고 설명할 수 있다.
    => 앨리스의 키와 문의 높이라는 두 가지 상태만 알면 문을 통과하는 행동의 결과를 쉽게 예측 가능

  • 상태를 이용하면 과거에 얽매이지 않고 현재를 기반으로 객체의 행동 방식을 이해할 수 있다.
    => 세상의 복잡성을 완화하고 인지 과부하를 줄일 수 있는 중요한 개념

  • 객체의 상태를 구성하는 모든 특징을 통틀어 객체의 프로퍼티라고 한다.
    => 프로퍼티는 정적이지만 프로퍼티 값은 동적이다.

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

🏋️‍♀️ 행동

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

  • 객체의 행동에 의해 객체의 상태가 변경된다는 것은 행동이 부수 효과를 초래한다는 것을 의미한다.
    => 케이크를 먹는 행위는 앨리스의 키를 변화시키고 케이크 양을 줄이는 부수 효과를 야기한다.

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

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

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

⚽ 협력과 행동

  • 객체가 다른 객체와 협력하는 유일한 방법은 다른 객체에게 요청을 보내는 것

  • 요청을 수신한 객체는 요청을 처리하기 위해 적절한 방법에 따라 행동한다.
    => 객체의 행동은 객체가 협력에 참여할 수 있는 유일한 방법

  • 객체가 어떤 행동을 하도록 만드는 것은 객체가 외부로부터 수신한 메시지
    => 수신된 메시지에 따라 행동하면서 협력에 참여하고 자신의 상태를 변경한다.

  • 객체는 협력에 참여하는 과정에서 다른 객체의 상태 변경을 유발할 수도 있다.
    => 앨리스가 음료를 마시면 키가 작아지는 동시에 음료의 양이 줄어든다.

💊 상태 캡슐화

  • 객체지향 세계에서 모든 객체는 자신의 상태를 스스로 관리하는 자율적인 존재
    => 앨리스가 음료를 마시면, 앨리스가 직접 음료의 상태를 변경할 수 없다.
    => 음료수를 마셨다는 메시지를 전달할 수 있다.

  • 메시지 송신자는 수신자의 상태 변경에 대해서 알 수 없다.

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

  • 메시지 해석과 상태 변경 여부는 전적으로 수신자의 자율적인 판단에 따른다.
    => 객체의 자율성을 높인다. -> 객체의 지능이 높아진다 -> 협력은 유연해지고 간결해진다.

🔑 식별자

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

  • 객체를 서로 구별할 수 있는 특정한 프로퍼티, 값과 객체의 큰 차이점
    => 모든 객체는 식별자를 가지며 식별자를 이용하여 객체를 구별할 수 있다.

  • 객체는 상태가 변경되는 객체는 가변 상태를 가진다.
    => 동일성 판단을 위한 상태 변경에 독립적인 식별자를 이용한다.

동등성 vs 동일성

  • 동등성 : 상태를 이용해 타입이 같은 두 값이 같은지 판단할 수 있는 성질 => 식별자 필요 x
  • 동일성 : 식별자를 기반으로 객체가 같은지 판단할 수 있는 성질 => 식별자 필요 o

🦔 행동이 상태를 결정한다.

상태를 먼저 결정하고 행동을 결정하는 방법이 안 좋은 이유는 ?

  1. 캡슐화가 저해된다.
    => 상태에 초점을 맞출경우 공용 인터페이스에 그대로 노출되버릴 확률이 높다.

  2. 객체를 협력자가 아닌 고립된 섬으로 만든다.
    =>협력이라는 문맥에서 멀리 벗어난 채 객체를 설계하게 한다.

  3. 객체의 재사용성이 저하된다.
    => 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기가 어렵다.

🤖 훌륭한 객체 시민 양성을 위해 행동에 초점을 맞춰라

  • 객체의 행동은 객체가 협력에 참여하는 유일한 방법이다.
    => 객체의 적합성을 결정하는 것은 상태가 아닌 객체의 행동이다.

  • 행동을 결정한 후에야 행동에 필요한 정보가 무엇인지 고려하고 이 과정에서 상태가 결정된다.

  • 협력 안에서 객체의 행동은 객체가 협력에 참여하며 완수해야하는 책임을 의미한다.
    => 어떤 책임이 필요한가를 결정하는 과정이 전체 설계를 주도해야한다.

책임 주도 설계 (Responsibility-Driven Desgin)

  • 협력이라는 문맥 안에서 객체의 행동을 생각하도록 도움으로써 응집도 높고 재사용 가능한 객체를 만들 수 있게 한다.

🎅 의인화

의인화의 관점에서 소프트웨어를 생물로 생각하자. 모든 생물처럼 소프트웨어는 태어나고 , 삶을 영위하고, 그리고 죽는다. -레베카 워프스브록

  • 레베카 워프스브록은 현실의 객체보다 더 많은 일을 할 수 있는 소프트웨어 객체의 특징을 의인화 라고부른다.

  • 소프트웨어 객체를 창조할 때 우리는 현실 세계의 객체를 모방하지 않는다.
    => 현실 세계의 객체와는 전혀 다른 특징을 부여하는 것이 일반적, 추가적인 능력

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

  • 객체지향의 세계는 현실의 추상화가 아니다.

🐏 은유

은유의 본질은 한 종류의 사물을 다른 종류의 사물 관점에서 이해하고 경험하는 데 있다. -Lakoff
은유는 표현적 차이 또는 의미적 차이라는 논점과 관련성이 깊다 - Larman

  • 실제로 적용되지 않는 한 가지 개념을 이용해 다른 개념을 서술하는 대화의 한 형태

  • 그리스어인 transfer에서 유래됐는데, 은유가 하나의 의미를 다른 것을 이용해 전달한다는 의미를 가지고 있기 때문
    => ex) 그 사람은 양 같아요, 그 사람은 사자같아요

  • 현실속의 전화기는 스스로 전화를 걸 수 없지만 현실의 전화기라는 개념을 이용해 소프트웨어 객체를 묘사하면 그 객체가 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있다.

  • 은유 관계에 있는 실제 객체의 이름을 소프트웨어 객체의 이름으로 사용하면 표현적 차이를 줄여 소프트웨어의 구조를 쉽게 예측할 수 있다.
    => 이 때문에 현실 세계인 도메인에서 사용되는 이름을 객체에 부여하라고 가이드 하는 것


객체지향 설계자로서 우리의 목적은 현실을 모방하는 것인 아닌 이상한 나라를 창조하기만 하면된다. 현실을 닮아야 한다는 어떤 제약이나 구속도 없다. 현실을 무시하고 자유롭게 여러분 만의 새로운 세계를 창조하기 바란다. 앨리스를 매혹시킨 이상한 나라가 그런 것 처럼 말이다.

0개의 댓글