[01] 협력하는 객체들의 공동체
입학하고 1년 동안 파이썬과 C++을 배우면서 항상 들었던 말이 있다.
객체지향이란 실세계를 모방하고, 현실 세계에 존재하는 사물에 대한 추상화이다.
그런데 필자는 이렇게 말한다. 철학적인 개념을 설명하는 데는 적합하지만, 실용적 관점에서 설명하기에는 적합하지 않다고.
반은 맞고 반은 틀리다는 뜻인 것 같다.
그렇지만 실세계의 모방이라는 개념은, 객체지향의 기본적 개념과 틀을 설명하기에는 효과적이라는 점에 필자도 동의하며 한시적으로 이러한 비유를 통해 객체의 세계를 설명한다.
필자는 아침에 직장인이 출근하여 카페에서 커피를 주문하는 상황을 예시로 들어 객체 간의 관계를 설명한다.
커피를 주문하는 손님, 주문을 받는 캐시어, 주문대로 커피를 뽑아내는 바리스타.
이 세 명을 중심으로 각각의 역할과 책임, 협력을 통해 커피 주문이라는 공통의 목적을 수행하는 과정을 설명한다.
손님은 캐시어에게 커피를 주문하는 요청을, 캐시어는 바리스타에게 커피를 제조하는 요청을 한다.
요청을 받은 바리스타는 캐시어에게 커피가 완성되었다는 응답을, 캐시어는 손님에게 커피가 완성되었다는 응답을 보낸다.
이렇게 요청과 응답을 통해 협력이 이루어진다.
위 상황에서, '사람'을 '객체'로, '요청'을 '메시지'로, '요청을 처리하는 방법'을 '메서드'로 바꾸면 대부분의 설명을 객체지향으로 바꿀 수 있다.
시스템은 역할과 책임을 수행하는 객체로 분할되고 시스템의 기능은 객체 간의 연쇄적인 요청과 응답의 흐름으로 구성된 협력으로 구현된다.
아주 작은 기능조차 객체 하나로만이 아닌, 여러 객체들과의 협력을 통해 기능을 구현하게 된다.
객체는 '협력적'이어야 하고, '자율적' 이어야 한다고 말하고 있다.
협력적이어야 한다는 것은, 객체는 다른 객체의 요청에 잘 응답해야 하고, 다른 객체에 요청을 하게끔 열려 있어야 한다.
자율적이어야 한다는 것은, 객체는 스스로의 결정과 판단에 따라 행동하는 자율적인 존재여야 한다.
객체는 자신만의 사고체계가 없는데, 어떻게 협력적이어야 하고 자율적이어야 한다는 것일까? 객체가 저렇게 작동하도록 협력적이고 자율적으로 설계를 해야 한다는 것일까?
필자는 객체지향의 본질은 객체이지, 클래스가 아니라고 말한다. 생각해 보면, 클래스의 구성 요소는 어떻고 클래스는 상속이 되고 클래스는 어떻게 짜는게 좋고.... 항상 클래스의 우선순위가 더 높았던 것 같긴 하다.
하지만 필자는 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과하고, 실제로 협력에 참여하는 것은 객체라고 말한다.
클래스의 구조와 메서드가 아니라 객체의 역할, 책임, 협력에 집중하라. 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.
아마 이에 대해서 반박하는 사람들도 있을 만한 부분인 것 같다. 하지만 소프트웨어를 구현할 때 객체의 구성에 좀 더 집중하라는 말은 새겨두어야 할 것 같다.