객체지향의 사실과 오해 — 1장. 협력하는 객체들의 공동체

InJeong Choi
5 min readJul 8, 2022

--

객체지향에 대해 기본적인 부분부터 이해를 넓혀가기 위해 이 책을 읽게 되었습니다. 혼자 읽다보니 끝까지 읽기가 힘들어서, 성공적인 정주행을 위해 밑줄치면서 읽었던 부분을 짧게 정리해서 올려보려고 합니다. 8월 안에 8장까지 모두 올리는 것을 목표로 꾸준히 작성해보겠습니다.

1장. 협력하는 객체들의 공동체

  • 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다.
  • 객체지향에서 가장 중요한 개념 세 가지
    - “역할”, “책임”, “협력”. 역할이 존재하고 역할에 따른 책임을 다함으로서 협력이 이루어진다.

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

  • 스스로 해결하지 못하는 문제를 요청함으로서 해결할 수 있다.
  • 요청은 연쇄적으로 발생한다. 여기서 요청은 메시지라고 한다.
  • 요청을 받는 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스를 제공한다. 즉, 요청에 응답한다. 여기서 요청에 대한 응답을 메서드라고 한다.
  • 요청과 응답을 통해 다른 사람과 협력(collaboration)한다.

협력이 원활하게 진행되는 데 필요한 핵심적인 구성요소, 역할과 책임

  • 각 사람은 협력하는 과정 속에서 특정한 역할(role)을 부여받는다.
  • 역할은 어떤 협력에 참여하는 특정한 사람이 협력에서 차지하는 책임이나 임무를 의미한다.
  • 역할은 책임이라는 개념을 내포한다.
  • 즉, 협력에 참여하며 특정한 역할을 수행하는 사람은 그에 적합한 책임을 수행하게 된다.
  • 적절한 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소이다.
  • 역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소이다.
  • 역할의 특징; 여러 객체가 동일한 역할을 수행할 수 있다. — 역할은 대체 가능성을 의미한다. — 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다. — 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

어떤 객체도 섬이 아니다. — 켄트 벡

  • 객체 공동체 안에 살고 있는 성실한 객체 시민은 자신에게 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와도 적극적으로 협력한다.
  • 객체지향 설계라는 예술은 적절한 객체에게 적절한 책임을 할당하는 것에서 시작된다.

객체란 무엇인가

  • 객체는 애플리케이션의 기능을 구현하기 위해 존재한다. 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.
  • 객체지향 애플리케이션의 아름다움을 결정하는 것이 협력이라면 협력이 얼마나 조화를 이루는지를 결정하는 것은 객체다. 결국 협력의 품질을 결정한는 것은 객체의 품질이다.

객체의 두 가지 덕목

  • 첫째, 객체는 충분히 ‘협력적’이어야 한다.

외부의 도움을 무시하고 혼자 모든 것을 스스로 처리하려고 하는 전지전능한 객체(god object)는 내부적인 복잡도에 의해 자멸하고 만다. 그렇다고 객체는 수동적인 존재를 의미하는 것이 아니다. 명령에 복종하는 것이 아니라 요청에 응답할 뿐이다. 어떤 방식으로 응답할지는 객체 스스로 판단하고 결정한다.

  • 둘째, 객체가 충분히 ‘자율적’이어야 한다.

자율적이란, 자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것이다. 객체지향 설계의 묘미는 다른 객체와 조화롭게 협력할 수 있을 만큼 충분히 개방적인 동시에 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적인 객체들의 공동체를 설계하는 데 있다.

객체 = 상태(state) + 행동(behavior)

  • 객체가 협력에 참여하는 과정 속에서 스스로 결정하는 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 함께 지니고 있어야 한다.
  • 객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
  • 객체의 사적인 부분은 객체 스스로 관리하고 외부에서 일체 간섭할 수 없도록 차단해야 한다.
  • 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야 한다.
  • 객체는 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만 어떻게(how) 수행하는 지에 대해서는 알 수 없다.

메시지와 메서드

  • 객체지향의 세계에서는 메시지라는 오직 한 가지의 의사소통 수단만이 존재한다. 메시지를 통해 요청하면, 객체가 수신된 메시지를 처리하는데 이를 메서드라고 한다.
  • 수신자(메시지를 받은 객체)는 수신된 메시지를 이해할 수 있는지 여부를 판단한 후 미리 정해진 자신만의 방법에 따라 메시지를 처리한다.
  • 객체는 런타임에 메서드를 선택할 수 있다. (실행코드를 컴파일타임에 결정하는 절차적인 언어와 확연히 구분되는 특징이다.)
  • 메시지와 메서드를 분리하는 것은 객체의 협력에 참여하는 객체들 간의 자율성을 증진 시킨다.
  • 외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이며, 이는 캡슐화 (encapsulation) 개념과도 깊이 관련되어 있다.

객체지향의 본질

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

객체를 지향하라

  • 객체지향 하면 떠오르는 클래스에 주의하라. 객체지향의 핵심은 클래스가 아니다. 핵심은 적절한 책임을 수행하는 역할 간의 유연하고 견고한 협력 관계를 구축하는 것이다. 클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다.
  • 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라.

마무리

이번 장을 읽으며 객체의 역할, 책임, 협력의 기조에는 독립된 객체의 자율성을 지키는 데 있다고 느꼈습니다. 이제까지 객체의 자율성을 충분히 보장한 설계를 해오지 못했던 것 같은데, 앞으로 이 부분에 집중해서 고민을 해봐야겠다고 생각했습니다. 캡슐화를 통해 외부 요청과 이를 처리하는 내부 로직을 명확하게 분리해내는 것이 유연하고 재사용에 좋은 객체를 만들어내는 시작이라는 것을 알게 되었습니다.

도서 - 객체지향의 사실과 오해 (조영호 저)

--

--