<객체지향의 사실과 오해, 조영호 지음 / 위키북스> 1장을 읽고 정리한 내용입니다.

객체지향 관련 아티클이나 도서를 살펴보면 실세계의 모방으로 설명하는 경우가 많은데 이유가 뭘까?

  • 객체지향 패러다임을 이해하기에 실세계의 모방이라는 비유가 꽤나 적절할 수 있기 때문에 관습처럼 사용되는 비유이지만, 반은 맞고 반은 틀린 표현이다.

  • 객체지향 패러다임은 객체를 자율적인 존재로 본다. 자율적인 객체들이 메시지를 통해 요청과 응답을 주고 받으며, 각자 맡은 역할에 따라 책임을 이행하며 협력에 참여한다고 본다.
  • 소프트웨어 세계의 객체를 실세계의 생명체처럼 살아있는, 자율적인 존재로 보는 것은 객체지향 패러다임에서 주장하는 캡슐화를 설명하는 데에도 용이하다.
  • 예를 들어, 객체는 자율적인 존재이므로 외부 객체가 다른 객체의 상태를 직접적으로 변경할 수 없다. 객체는 외부 객체의 요청을 수신하고, 어떤 행동을 통해 상태를 변경할지 스스로 결정할 수 있는 자율적인 존재이다.

  • 이외에도, 객체들이 메시지를 주고 받으며 협력하는 과정은 실세계에서 사람들이 약속이나 계약 등을 통해 협력하는 것과 유사하다고 볼 수 있다.

  • 정리하자면 객체지향 패러다임을 실세계의 모방으로 비유하는 이유는 실세계의 협력하는 공동체의 모습을 떠올리면 객체지향 패러다임의 기본 사상을 더욱 쉽게 이해할 수 있기 때문이다.

  • 하지만, 객체지향 패러다임을 그저 실세계의 모방으로만 보는 것은 적절하지 않다.

  • 객체지향 패러다임의 객체는 실세계의 객체보다 훨씬 다양한 역할을 할 수 있기 때문이다. 예를 들어, 실세계의 계산기는 스스로 계산을 할 수 없다. 하지만, 객체지향 세계의 계산기는 외부 요청에 따라 스스로 계산을 할 수 있다.
  • 이처럼, 객체지향 패러다임을 제대로 이해하기 위해서는 실세계의 모방이라는 비유를 적절히 이해하면서, 실세계의 객체의 모습보다 훨씬 더 다양한 역할을 이행할 수 있는 객체들을 통해 실세계를 능가하는 새로운 세계를 창조한다고 생각하는 것이 바람직하다.

협력하는 사람들

  1. 협력 일상에서 발생하는 문제들은 대개 혼자 해결하기 어렵다.
    예를 들어, 카페에서 커피 한 잔을 마시고 싶다면 고객은 캐시어에게 주문을 하고, 바리스타가 커피를 만드는 등등의 협력 관계가 필요하다.
    우리는 문제를 함께 해결하기 위해 협력을 하는데, 이는 요청(request)응답(response)로 구성된다.
    협력의 성공 여부는 결국 각 개인이 요청을 얼마나 성실히 이행하는지에 달려 있다.

  2. 역할과 책임 특정한 역할은 특정한 책임을 암시한다. 협력에 참여하여 특정한 역할을 수행하는 사람들은 역할에 적합한 책임을 수행하게 된다. (p.27) 즉, 사람들은 협력을 위해 특정한 역할을 맡고 해당 역할에 맞는 책임을 수행한다.
    이를 통해 아래와 같은 개념을 파악할 수 있다.

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

역할, 책임, 협력

객체지향이 실세계에서 문제를 해결해가는 과정과 유사하여 실세계의 모방이라는 은유를 사용한다고 했다.
객체지향에서의 협력과 실세계의 협력에는 어떤 차이점이 있을까?

실세계에서 사람들은 공통의 목표를 달성하기 위해 협력하지만, 객체들은 애플리케이션의 기능 구현을 위해 협력한다.
따라서, 한 객체에 적절한 책임을 할당하는 것이 중요하다.

협력 속에 사는 객체

객체지향은 각 객체가 역할에 맞는 책임을 이행하면서 서로 협력한다.
즉, 협력의 주체는 객체이다.
앞서서 각 객체가 역할에 맞는 책임을 다 하는 것이 중요하다고 했는데 이는 다시 말해서 협력의 품질을 결정하는 것이 객체의 품질이라 할 수 있겠다.
객체의 품질은 어떻게 평가할까?

  • 객체는 충분히 협력적이어야 한다: 다른 객체의 요청에 충실히 귀 기울이면서 다른 객체에게 적극적으로 도움을 요청할 수도 있어야 한다.
    • 충분히 협력적이라는 표현은 객체가 단순히 명령에 따라 수동적으로 행동한다는 의미가 아니다.
    • 객체는 단지 요청에 응답할 뿐이다. 요청에 어떤 방식으로 응대할지 객체가 결정할 수 있어야 한다. 또한, 요청에 응답할지의 여부도 객체가 스스로 결정할 수 있어야 한다.
  • 객체는 충분히 자율적이어야 한다.
    • 충분히 협력적이기 위해서 객체가 자율적으로 응답할 수 있어야 한다.

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

객체를 상태(state)와 행동(behavior)을 함께 지닌 실체라 정의한다.
객체가 충분히 협력적이고, 자율적으로 요청을 판단하고, 응답하는 존재가 되려면 필요한 행동과 상태를 함께 지니고 있어야 한다.
어떠한 행동을 하기 위해서는 해당 행동에 필요한 상태를 알고 있어야 하기 때문이다.

객체는 무엇을(what) 수행하는지는 알고 있지만, 어떻게(how) 수행하는지는 알 수 없다.
객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것에서부터 출발하는데 객체 내부적인 부분은 객체에서 스스로 관리하고 외부에서는 간섭할 수 없어야 하며, 반대로 객체의 외부에서는 접근이 허락된 수단을 통해서만 객체와 의사소통하기 때문이다.

즉, 객체의 관점에서 자율성이란 자신의 상태를 직접 관리하고, 상태를 기반으로 스스로 판단하고 행동할 수 있음을 의미한다. (p.33)

협력과 메시지

실세계에서는 요청을 위해 말, 글 등 다양한 메커니즘을 사용할 수 있다.
반면에 객체지향에서는 오직 메시지라는 의사소통 수단만을 통해 요청을 전달한다.
즉, 협력을 위해 한 객체에서 다른 객체로 메시지를 전송하고, 다른 객체로부터 메시지를 수신한다.
메시지를 전송하는 객체를 송신자(sender)라고 부르고 메시지를 수신하는 객체를 수신자(receiver)라고 부른다.

메서드와 자율성

객체는 협력을 위한 요청의 수단으로 메시지를 전송한다고 했다.
수신 받은 메시지를 처리하는 방법을 메서드(method)라고 부른다.

객체의 자율성을 증진하기 위해 메시지와 메서드의 분리가 필요하다.
커피 제조를 요청한 캐시어는 커피가 제조될 것을 예측할 수 있지만, 구체적으로 커피를 제조하는 방법에는 관여하지 않기 때문이다.
바리스타는 커피 제조라는 메시지에 응답하기 위해 자신만의 자율적인 방법을 따라 커피를 제조한다. (p.35)

메시지와 메서드를 분리하는 것은 캡슐화(encapsulation)와도 관련이 깊다.

객체지향의 본질

자율적인 객체들이 각자의 역할에 따른 책임을 수행하며 협력하는 것이다.
자율적인 객체란 상태와 행동을 가지고 있으며, 스스로 자신의 상태와 행동을 책임지는 객체임을 의미한다.
이때 협력하는 의사소통(요청)의 수단으로 메시지를 사용하고, 요청을 처리하기 위해 적합한 메서드를 자율적으로 선택할 수 있어야 한다.

객체를 지향하라

흔한 객체지향에 대한 오해는 클래스의 관점으로만 바라보는 것이다.
이러한 관점으로 객체지향 설계를 하려다보면 객체의 캡슐화를 저해할 수 있다.
따라서, 객체지향 설계를 잘하기 위해서는 메시지를 주고받는 객체의 관점으로 바라보는 것이다.
결국 어떤 객체들이 어떤 메시지를 주고받으며 협력하는지가 핵심적이기 때문이다.
따라서, 클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하자!

댓글남기기