객체지향에서 가장 중요한 개념인 역할, 책임, 협력을 책에서는 카페에 빗대어 설명한다.
손님 - 커피를 주문한다
캐시어 - 주문을 받는다
바리스타 - 커피를 만든다
사람들은 각자의 역할과 책임을 다하며 헙력에 참여한다.
손님의 카페인을 보충하는 목적을 위해 세 사람이 협력한다.
협력은 요청과 응답으로 이루어져있다.
손님 --(커피 주문 요청)--> 캐시어 --(커피 제조 요청)--> 바리스타
손님 <--(커피 완성 응답)-- 캐시어 <--(커피 완성 응답)-- 바리스타
요청은 연쇄적으로 작용하며, 응답 또한 그의 역순으로 연쇄적으로 작용한다.
협력하는 과정에서 각자의 역할(role)이 주어진다.
역할은 책임(responsibility)을 내포한다.
역할 | 책임 |
---|---|
손님 | 커피 주문 |
캐시어 | 주문 내용 전달, 커피 완성 알림 |
바리스타 | 커피 제조, 커피 완성 알림 |
역할에 적합한 책임을 맡는다는 사실은 몇가지 중요한 개념을 제시한다.
여러 사람이 동일한 역할을 수행할 수 있으며 대체 가능(substitutable)하다.
: 손님 입장에서 주문한 커피를 받을 수만 있다면, 어떤 캐시어가 주문을 받든 상관이 없다. 캐시어의 입장에서 전달한 주문 내역에 맞게 커피만 나온다면 어떤 바리스타든 상관이 없다.
책임을 수행하는 방법은 자율적으로 선택할 수 있다.
: 바리스타는 각자의 독특한 방법으로 커피를 제조할 수 있다. 동일한 요청에 서로 다른 방식으로 응답할 수 있는 능력을 다형성(polymorphism)이라고 한다.
한 사람이 동시에 여러 역할을 수행할 수 있다.
: 카페 사장은 캐시어와 바리스타의 역할을 동시에 수행할 수도 있다.
협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것이다.
위의 커피 주문 과정은 객체지향의 주요 개념을 대부분 포함하고 있다.
사람을 객체로, 각각의 요청을 메시지로, 요청을 처리하는 방법을 메서드로 생각할 수 있다.
카페의 사람들은 손님의 카페인 보충이라는 목적을 위해 협력하고,
객체들은 애플리케이션 기능을 동작하기 위해 협력한다.
따라서 객체는
1. 충분히 협력적이어야 하며,
2. 또한 충분히 자율적이어야 한다.
객체의 자율성은 객체의 내부와 외부를 명확하게 구분하는 것에서 나온다.
객체는 다른 객체가 무엇(what)을 하는지는 알지만 어떻게(how) 수행하는지는 알지 못한다.
객체가 자율성을 갖기 위해서는 필요한 상태(state)와 행동(behavior)을 함께 지녀야 한다.
좋은 객체지향 설계란 객체에게 적절한 책임을 부여하는 것에서 시작된다.
메시지 - 외부의 요청
메서드 - 요청을 처리하기 위한 구체적인 방법
메시지와 메서드를 분리하는 것은 객체의 자율성을 높이는 핵심 메커니즘이다.
이것은 캡슐화(Encapsulation)와도 깊은 연관이 있다.
각 객체는 자신만의 독특한 방법(메서드)로 요청(메시지)을 처리할 수 있다.
메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있다는 점은 객체지향 프로그래밍 언어를 구분 짓는 핵심적인 특징 중 하나이다.
그렇다면 객체지향이란 무엇인가?