Book Record

[객체지향의 사실과 오해] Chapter1. 협력하는 객체들의 공동체

그냥팬더 2021. 4. 20. 16:33
반응형

01. 협력하는 객체들의 공동체

  • 객체지향: 실세계의 모방

    • 철학적인 관점에서는 옳으나, 실용적인 관점에서는 옳지 않다.
    • 기본 사상을 이해하고 학습하는데에는 효과적이다.
  • 실제 객체지향의 목표: 새로운 세계를 창조하는 것

    • 고객과 사용자를 만족시킬 수 있는 신세계

협력하는 사람들

요청과 응답으로 구성된 협력

  • 스스로 해결하지 못하는 문제를 해결 할 때, 도움을 요청(Request)한다.
    • 한 사람의 요청은 또 다른 사람에게 요청을 유발해, 연쇄적으로 발생한다.
  • 요청을 받은 사람은 다른 사람의 요청에 응답(Response)한다.
    • 응답 역시 요청의 방향과 반대 방향으로 연쇄적으로 전달된다.
  • 요청과 응답을 통해 협력(Collaboration) 할 수 있는 능력은 복잡한 문제를 해결할 수 있게 한다.

역할과 책임

  • 사람들은 다른 사람과 협력하는 과정 속에서 역할(Role)을 부여 받는다.
    • 협력 안에서 차지하는 책임, 의무를 의미한다.
    • 역할은 책임이라는 개념을 내포한다.
  • 특정한 역할은 특정한 책임을 암시한다.
    • 특정할 역할을 수행하는 사람들은 역할에 적합한 책임을 수행하게 된다.

중요한 개념

  • 여러 사람이 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
    • 다수의 수신자가 동일한 역할을 수행할 수 있다면 요청자는 어떤 사람이 역할을 수행해도 문제가 되지않는다.
  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
    • 요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택할 수 있다.
    • 서로 다른 방식으로 요청을 처리할 수 있다. (다형성)
  • 한 사람이 동시에 여러 역할을 수행할 수 있다.

역할, 책임, 협력

역할과 책임을 수행하며 협력하는 객체들

  • 협력의 핵심: 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것이다.

'어떤 객체도 섬이 아니다.'

시스템의 목적을 위해 다른 객체와 적극적으로 협력한다.

  • 시스템의 기능은 여러 객체가 협력해서 일궈낸 결실.
  • 애플리케이션의 기능은 더 작은 책임으로 분할되고, 책임은 적절한 역할을 수행할 수 있는 객체에 의해 수행된다.
  • 역할은 유연하고 재사용 가능한 협력 관계를 구축하는데 중요한 설계 요소.

협력 속에 사는 객체

  • 객체: 협력에 참여하는 주체
    • 끊임없이 메시지를 주고 받으며, 협력한다.
  • 객체는 기능을 구현하기 위해 존재한다.

객체가 가져야할 덕목

  1. 객체는 충분히 '협력적'이어야 한다.
    • 다른 객체의 요청에 충실히 귀 기울이고, 다른 객체에 적극적으로 도움을 요청할 정도의 열린 마음.
    • 단, 어떻게 요청에 응답할 지는 스스로 결정하고 판단한다.
  2. 객체가 충분히 '자율적'이어야 한다.
    • 스스로의 결정과 판단에 따라 행동한다.

상태와 행동을 함께 지닌 자율적인 객체

  • 객체: 상태행동을 지닌 실체.
  • 객체의 자율성은 내부와 외부를 명확하게 '구분'하는 것으로부터 나온다.
    • 사적인 부분(내부)은 객체 스스로 관리하고, 외부로부터 차단해야 한다.
    • 객체의 외부에서는 허락된 수단만으로 의사소통해야 한다.
  • 다른 객체가 '무엇'을 수행하는지는 알 수 있지만, '어떻게' 수행하는지에 대해서는 알 수 없다.
  • 과거 개발은 데이터와 프로세스를 분리
    • 객체지향에서는 데이터와 프로세스를 객체에 묶어 놓아 객체의 자율성을 보장한다.

협력과 메시지

  • 메시지: 한 객체가 다른 객체에게 요청하는 것을 메시지를 전송한다고 말하고 다른 객체로부터 요청을 받는 것을 메시지를 수신한다고 말한다.
    • 객체는 다른 객체에게 메시지를 전송하고, 다른 객체로부터 메시지를 수신한다.

메서드와 자율성

  • 메서드: 객체가 수신된 메시지를 처리하는 방법.
    • 메시지를 수신한 객체가 메서드를 선택할 수 있다는 점은 객체지향 프로그래밍을 구분 짓는 핵심적인 특징 중 하나다.
  • 메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시킨다.

객체지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법.
  • 자율적인 객체란 상태와 행위를 지니며 스스로 책임지는 객체를 의미한다.
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체들과 협력한다.
    • 각 객체는 정해진 역할을 수행하며, 역할은 관련된 책임의 집합이다.
  • 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다.

객체를 지향하라

  • 클래스: 객체지향 프로그래밍의 중심 개념이라 생각한다.
    • 하지만, 매우 중요한 구성요소지, 중심 개념은 아니다.

훌륭한 객체지향 설계자가 되려면

  • 클래스의 관점에서 메세지를 주고받는 객체의 관점으로 사고의 중심을 전환하도록 도전.
    • 어떤 클래스가 필요한가가 아니라, 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가
  • 객체지향의 핵심은 클래스가 아니라, 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것.

"객체의 역할, 책임, 협력에 집중하라. 객체 지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다"

반응형