본문 바로가기
Book Record

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

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

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

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

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

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

협력하는 사람들

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

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

역할과 책임

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

중요한 개념

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

역할, 책임, 협력

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

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

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

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

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

협력 속에 사는 객체

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

객체가 가져야할 덕목

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

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

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

협력과 메시지

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

메서드와 자율성

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

객체지향의 본질

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

객체를 지향하라

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

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

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

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

반응형

댓글