객체란
사용자들이 이용하는 서비스의 기능을 구현하기 위해 현실 세계와 유사한 상태와 행위를 지닌 존재
기능 구현이라는 목표를 위해 다른 객체들과 역할과 책임을 분리하며 협력하는 존재이다.
요청과 응답으로 구성된 협력
요청
스스로 해결하지 못하는 문제와 마주치면 문제 해결에 도움을 줄 수 있는 대상에게 요청을 합니다.
커피 주문 (요청)
- 손님은 캐시어에게 커피를 주문한다.
- 주문을 받은 캐시어는 주문 내역을 바리스타에게 전달한다.
응답
요청을 받은 대상은 주어진 책임을 다하면서 필요한 지식이나 서비스를 응답합니다.
커피 주문 (응답)
- 바리스타는 커피를 제조한 후 캐시어에게 알려주며 응답합니다.
- 캐시어는 주문된 커피를 손님에게 알려주며 응답합니다.
✅ 요청과 응답을 통해 다른 사람과 협력이 이루어집니다.
역할과 책임
역할이란
어떤 협력에 참여하는 특정한 사람이 협력 안에서 수행하는 책임이나 의무를 의미합니다.
ex) 커피를 주문하는 손님 (역할1), 손님으로부터 주문을 받는 캐시어 (역할2), 주문된 커피를 제조하는 바리스타 (역할3)
- 역할이라는 단어는 의미적으로 “책임” 이라는 개념을 내포합니다.
- 협력에 참여하며 특정한 역할을 수행하는 사람들은 역할에 적합한 책임을 수행합니다.
특정한 역할을 맡아 책임을 수행한다는 점이란
- 여러 사람이 동일한 역할을 수행할 수 있다.
- 손님 입장에서 자신이 주문한 커피를 마실 수만 있다면 어떤 캐시어가 주문을 받는지는 중요하지 않다.
- 단지, 손님에게 있어서 주문을 받는 존재만 있으면 된다.
- 역할은 대체 가능성을 의미한다.
- 주문을 받는 사람이 여러 명이어도 동일한 역할을 수행한다면, 요청자(손님) 입장에서는 누구에게나 요청을 보낼 수 있다.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다.
- 책임을 온전히 수행한다면 어떤 방식으로 수행하는지 알 필요가 없다.
- 커피 제조라는 동일한 요청에 있어 바리스타들은 서로 다른 방식으로 요청을 처리할 수 있다.
- 한 사람이 동시에 여러 역할을 수행할 수 있다.
- 특정 상황에서는 A 역할, 다른 상황에서 B 역할을 수행할 수도 있다.
기능을 구현하기 위해 협력하는 객체들
객체지향 방식으로 사고하기
- 사람 → 객체
- 요청 → 메시지
- 요청을 처리하는 방법 → 메서드
객체 지향의 근본 개념은 실세계에서 사람들이 타인과 관계를 맺으면 협력하는 과정을 추상화한 것이다.
협력 속에 사는 객체
객체는 애플리케이션의 기능을 구현하기 위한 주체이다.
작은 기능이든 큰 기능이든 일반적으로 객체는 다른 객체와의 협력을 통해 기능을 구현하게 된다.
- 객체는 충분히 협력적이어야 한다.
- 다른 객체의 요청에 귀기울이고 다른 객체에게 적극적으로 도움을 요청할 정도로 협력적이어야 합니다.
- 객체는 충분히 자율적이어야 한다.
- 다른 객체와 조화롭게 협력할 수 있을만큼 충분히 협력적인 동시에 협력에 참여하는 방법을 스스로 결정할 수 있다.
상태와 행동을 지닌 자율적인 객체
객체는 상태와 행동을 지닌 실체이다.
객체가 협력에 참여하기 위해 어떤 행동을 해야 한다면 그 행동을 하는 데 필요한 상태도 함께 지니고 있어야 하는 것을 의미합니다.
객체의 자율성은 객체의 내부와 외부를 구분하는 것에서 나온다!
- 객체의 사적인 부분(private)은 객체 스스로 관리하고 외부에서 일체 간섭할 수 없도록 한다.
- 외부에서는 접근이 허락된 수단을 통해서만 의사소통합니다.
✅ 객체는 다른 객체가 무엇을 수행하는 지는 알 수 있지만, 어떻게 수행하는 지에 대해서는 알 수 없다.
메시지, 메서드
객체지향에서 의사 소통은 메시지를 통해 이루어집니다.
메시지를 전송하는 객체를 송신자 / 메시지를 수신하는 객체를 수신자
메서드는 객체가 수신된 메시지를 처리하는 방법을 의미합니다.
- 바리스타로 전달된 커피 제조 요청이 메시지이고 커피를 제조하는 구체적인 방법이 메서드입니다.
- 커피 제조를 요청한 캐시어는 커피가 제조될 것이라고 기대하지만 (What 알 수 있음) 커피를 제조하는 구체적인 방법에 관해서는 관여하지 않는다. (How 알 수 없음)
훌륭한 객체지향 설계자가 되기 위해서
코드를 담는 클래스의 관점에서 메시지를 주고 받는 객체의 관점으로 사고를 전환해야 합니다.
어떤 객체들이 어떤 메세지를 주고받으며 협력하는지가 중요합니다.
(클래스는 협력에 참여하는 객체를 만드는 방법일 뿐이다.)