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

devssun 2019. 11. 8. 22:45
728x90
반응형

객체지향의 사실과 오해

1) 협력하는 객체들의 공동체

객체지향의 목표는 실세계를 모방하는 것이 아니다.
오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다.

협력하는 사람들 - 커피 공화국의 아침 ☕️

손님, 캐시어, 바리스타 사이의 암묵적인 협력 관계가 존재한다.

손님 - 카페인을 채우기 위해 커피를 주문할 책임을 수행한다.
캐시어 - 손님의 주문을 받는 책임을 성실히 수행한다.
바리스타 - 주문된 커피를 제조하는 책임을 수행한다.

역할, 책임, 협력 은 우리가 삶을 영위하기 위해 다른 사람과 접촉하는 모든 곳에 존재한다.

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

사람들은 스스로 해결하지 못하는 문제와 마주치면 문제 해결에 필요한 사람에게 도움을 요청(request) 한다.
요청을 받은 사람은 주어진 책임을 다하면서 다른 사람의 요청에 응답(response) 한다.

역할과 책임

사람들은 다른 사람과 협력하는 과정 속에서 특정한 역할(role)을 부여받는다.
카페에서 손님이 주문한 커피를 제조하기 위해 캐시어와 바리스타가 협력하는 과정 속에는 '손님', '캐시어', '바리스타' 라는 역할이 존재한다.

역할은 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 임무를 의미한다.
캐시어라는 역할을 맡은 사람은 손님으로부터 주문을 받아야만 한다.
바리스타 역할을 맡은 사람은 주문된 커피를 제조해야 할 책임이 있다.

역할이라는 단어는 의미적으로 책임이라는 개념을 내포한다.
역할과 책임은 협력이 원활하게 진행되는 데 필요한 핵심적인 구성 요소다.

사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념을 제시한다.

  • 여러 사람이 동일한 역할을 수행할 수 있다.
    손님 입장에서 자신이 주문한 커피를 마실 수만 있다면 어떤 캐시어가 주문을 받는지는 중요하지 않다.

  • 역할은 대체 가능성을 의미한다.
    손님 입장에서 캐시어는 대체 가능(subsititutable)하다.
    두 명이 동일한 역할을 수행할 수 있다면 요청자 입장에서 둘 중 어떤 사람이 역할을 수행하더라도 문제가 되지 않는다.

  • 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
    요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택할 수 있다. 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성(polymorphism) 이라고 한다.

  • 한 사람이 동시에 여러 역할을 수행할 수 있다.
    한 사람이 캐시어와 바리스타의 역할을 동시에 수행하는 것도 가능하다. 따라서 한 사람이 동시에 둘 이상의 역학을 수행하는 것도 가능하다.

역할, 책임, 협력

기능을 구현하기 위해 협력하는 객체들

위에서 봤던 것을 아래와 같이 변경할 수 있다
사람 → 객체
에이전트의 요청 → 메시지
요청을 처리하는 방법 → 메서드

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

객체의 역할

  • 여러 객체가 동일한 역할을 수행할 수 있다.
  • 역할은 대체 가능성을 의미한다.
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택할 수 있다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다.

역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소다

협력 속에 사는 객체

객체가 존재하지 않는 객체지향 세계 역시 아무런 의미가 없다. 패러다임의 중심에 객체가 있기 때문이다.
객체는 애플리케이션의 기능을 구현하기 위해 존재한다. 일반적으로 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.

  1. 협력적
    모든 것을 스스로 처리하려고 하는 전지전능한 객체(god object)는 내부적인 복잡도에 의해 자멸하고 만다.

  2. 자율적
    '자율적'이라는 단어의 뜻은 '자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것'을 의미한다.
    어떤 사물이 자신의 행동을 스스로 결정하고 책임진다면 우리는 그 사물을 자율적인 존재라고 말한다.

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

객체를 상태(state)행동(behavior) 을 함께 지닌 실체라고 정의한다.
객체가 협력에 참여하는 과정 속에서 스스로 판단하고 스스로 결정하는 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 함께 지니고 있어야한다.

객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것으로부터 나온다.
객체의 사적인 부분은 객체 스스로 관리하고 외부에서 일체 간섭할 수 없도록 차단해야 하며,
객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사 소통해야 한다.
→ 접근지정자

협력과 메시지

객체지향 세계에서는 오직 한 가지 의사소통 수단만이 존재한다. → 메시지
객체는 협력을 위해 다른 객체에게 메시지를 전송하고 다른 객체로부터 메시지를 수신한다. 협력은 메시지를 전송하는 객체와 메시지를 수신하는 객체 사이의 관계로 구성된다.

메서드와 자율성

객체가 수신된 메시지를 처리하는 방법을 메서드(method) 라고 부른다.
메시지와 메서드의 분리는 객체의 협력에 참여하는 객체들 간의 자율성을 증진시킨다.
커피를 제조하는 구체적인 방법이 메서드다.

외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다. 이것은 캡슐화(encapsulation)라는 개념과도 깊이 관련돼 있다.

객체지향의 본질

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

객체의 역할, 책임, 협력에 집중하라!

반응형