협력(collaboration)은 어떻게 이루어지는가?

각 객체는 다른 객체에게 요청(request)을 하고, 요청을 받은 객체는 응답(response) 한다. 이때 요청과 응답은 연쇄적으로 전달되며, 협력의 성공은 각 객체가 요청을 얼마나 성실히 이행하는가에 달려 있다. 이런 협력 관계 속에서 각 객체는 역할(role)을 부여받으며, 역할에 따른 책임(responsibility)을 수행한다.

역할과 책임

객체지향 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작되는데, 관련성 높은 책임의 집합을 역할이라고 한다. 역할은 유연하고 재사용 가능한 협력 관계를 구축하는 데 중요한 설계 요소이며, 다음과 같은 특징을 지닌다.

  • 여러 객체가 동일한 역할을 수행할 수 있다
    같은 책임을 수행할 수 있다면, 누가 책임을 수행하는지는 크게 중요하지 않다.
  • 역할은 대체 가능성(substitutable)을 의미한다
    마찬가지로 동일한 역할을 수행할 수 있다면, 누가 역할을 수행하는지는 문제가 되지 않는다.
  • 각 객체는 책임을 수행하는 방법은 자율적으로 선택할 수 있다
    같은 요청을 받았더라도 사람마다 처리 과정은 다를 수 있다. 이렇게 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 다형성(polymorphism)이라고 한다.
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다
    바리스타가 캐시어 역할을 동시에 할 수 있듯이, 동시에 둘 이상의 역할을 수행하는 것도 가능하다.

협력하는 객체

협력에 참여하는 주체는 객체이며, 객체의 품질이 협력의 품질을 결정한다. 객체는 다음 두 가지 덕목을 갖추면서 둘 사이의 균형을 유지해야 한다.

  • 객체는 충분히 '협력적'이어야 한다
    객체는 다른 객체의 명령에 복종하는 것이 아니라 요청에 응답할 뿐이다. 응답 방식이나 응답 여부 모두 객체 스스로 결정할 수 있다.
  • 객체는 충분히 '자율적'이어야 한다
    객체는 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제할 수 있다.

자율적인 객체

객체의 정의는 '상태(state)와 행동(behavior)을 함께 지닌 실체'이다. 즉 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단하고 행동하는 자율성을 가지고 협력에 참여한다. 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통해야 하는데, 따라서 다른 객체가 무엇(what)을 수행하는지는 알 수 있지만 어떻게(how) 수행하는지에 대해서는 알 수 없다.

데이터와 프로세스를 엄격히 구분하는 전통적인 개발 방법에 반해, 객체 지향에서는 데이터와 프로세스를 객체라는 하나의 틀 안에 함께 묶어놓음으로써 객체의 자율성을 보장한다. 이렇게 자율적인 객체로 구성된 공동체는 유지 보수가 쉽고 재사용이 용이한 시스템을 구축할 수 있는 가능성을 제시한다.

협력과 메시지

협력은 메시지를 전송하는 송신자(sender) 객체와 메시지를 수신하는 수신자(receiver) 객체 사이의 관계로 구성된다. 다른 객체에게 메시지를 전송하여 '요청'하고, 자신에게 요청한 객체에게 다시 메시지를 전송하여 '응답'한다.

메서드와 자율성

각 객체가 수신된 메시지를 처리하는 방법은 자율적으로 선택할 수 있다고 했었다. 여기서 메시지를 처리하는 방법을 메서드(method)라고 하며, 어떤 객체에게 메시지를 전송하면 메시지에 대응하는 특정 메서드가 실행된다. 프로시저 호출에 대한 실행 코드를 컴파일 시간에 결정하는 절차 지향 언어와 달리, 객체지향 언어는 메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다.
이렇게 외부 요청을 표현하는 메시지와 요청 처리 방법인 메서드를 분리하는 것은 객체의 자율성을 높이며, 캡슐화(encapsulation)와도 깊이 관련돼 있다.

객체지향의 본질

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

참고 문헌

  • 객체지향의 사실과 오해 / 조영호 저 / 위키북스 / 2022년 01월 27일