조영호님의 ‘객체지향의 사실과 오해’ 라는 책을 읽고 정리합니다.

“객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 단순히 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다” -p21-
요청과 응답으로 구성된 협력
- 사람들은 스스로 해결할 수 없는 문제를 만나면 문제 해결에 도움이되는 지식을 가지고 있거나 서비스를 제공해 주는 누군가에게 도움을 요청(Request)한다.
- 일반적으로 하나의 문제 해결을 위해 여러 사람의 도움이 필요함으로 요청은 연쇄적으로 발생한다.
- 요청을 받은 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스를 제공한다. 즉 다른 사람의 요청에 응답(Response) 한다.
- 요청과 응답을 통해 다른 사람과 협력(Collaboration)할 수 있는 능력은 인간으로 하여금 거대하고 복잡한 문제를 해결할 수 있는 공동체를 형성할 수 있게 만든다.
- 협력의 성공은 특정한 역할을 맡은 각 개인이 얼마나 요청을 성실히 이행하는가에 달려 있다.
역할과 책임
- 사람들은 다른 사람과 협력하는 과정 속에서 특정한 역할(Role)을 부여받는다.
- 역할은 어떤 협력에 참여하는 사람이 협력 안에서 차지하는 책임이나 의무를 의미한다.
- 역할은 관련성 높은 책임의 집합이다.
- 역할이라는 단어는 의미적으로 책임(Resonsibility)이라는 개념을 내포한다.
- 또한 특정한 역할은 특정한 책임을 암시한다. 선생님이라는 역할은 학생을 가르칠 책임이 있음을 암시하는 것 처럼 말이다.
- 역할과 책임은 협력이 원활히 진행되는 데 필요한 핵심적인 구성 요소이다.
중요한 개념
사람들이 협력을 위해 특정한 역할을 맡고 역할에 적합한 책임을 수행한다는 사실은 몇 가지 중요한 개념을 제시한다.
하나의 역할을 수행할 수 있는 사람은 많다
- 특정한 책임을 잘 이행할 수 있는 능력을 가진다면 누구나 그 역할을 맡을 수 있다.
- 커피를 맛 있게 제조할 수 있는 사람은 많다.
역할은 대체 가능하다
- 하나의 역할을 수행할 수 있는 다양한 사람이 있기 때문에 사실 역할은 대체 가능하다.
- 고객 입장에서는 누가 그 역할을 수행하는지에는 크게 신경쓰지 않는다. 다만 서비스 받기 원하는 책임을 잘 이행해 주는가에 관심이 있다.
- 고객은 맛있는 커피를 제공한다면 어떤 카페든 옮겨 다닐 수 있다.
책임을 수행하는 방법은 자율적으로 선택할 수 있다
- 고객이 원하는 책임을 수행하기만 한다면, 요청을 처리하는 방법은 서비스 제공자가 자유롭게 선택할 수 있다.
- 바리스타는 서로 다른 제품의 커피 머신을 사용할 수 있고, 커피를 제조하는 절차ㄷ 스스로 선택하고 결정해 나갈 수 있다.
한 사람이 동시에 여러 역할을 수행할 수 있다
- 한 역할을 수행할 수 있는 사람이 다양하지만 한 사람 역시 다양한 역할을 수행할 수도 있다.
- 카페의 상황에 따라 바리스타가 커피 주문을 받을 수도 있고, 카페 내부를 청소하는 사람이 될 수도 있는 것이다.
좋은 객체는
- 첫째, 객체는 충분히 ‘협력적’ 이어야 한다. 객체는 다른 객체의 요청에 충실히 귀 기울이고 다른 객체에게 적극적으로 도움을 요청할 정도로 열린 마음을 지녀야 한다. 외부의 도움을 무시한 채 모든 것을 스스로 처리하려고 하는 전지전능한 객체(god object)는 내부적인 복잡도에 의해 자멸하고 만다..
- 둘째, 객체는 충분히 ‘자율적’ 이어야 한다. 사람들은 다른 사람의 요청에 따라 행동하지만 최대한 스스로의 판단에 따라 결정하고 행동한다. 객체는 협력에 참여하는 방법을 스스로 결정할 수 있을 만큼 충분히 자율적이어야 한다.
협력 속에 사는 객체
- 객체가 협력에 참여하는 과정 속에서 스스로 판단하고 스스로 결정하는 자율적인 존재로 남기 위해서는 필요한 행동과 상태를 함께 지니고 있어야 한다. 객체는 다른 객체가 ‘무엇’을 수행하는지는 알 수 있지만 ‘어떻게’ 수행하는지에 대해서는 알 수 없다.
- 객체는 협력을 위해 다른 객체에게 메시지를 전송하고 다른 객체로부터 메시지를 수신한다.
- 외부의 요청이 무엇인지를 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다.