"객체지향의 사실과 오해" 책 내용을 체화하기 위해 읽으며 기록하는 노트이다.
실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이라고 대부분의 사람들이 말하지만,
객체 지향의 목표는 실세계 모방이 아닌 고객과 사용자를 만족시킬 수 있는 새로운 세계를 창조하는 것이다.
실세계의 모방이라는 개념은 비현실적이다.
하지만 객체지향을 실세계에 비유하는 것은 객체지향 용어에 담긴 사상을 설명하기에 적합하다.
상태와 행위를 캡슐화하는 소프트웨어 객체의 자율성을 설명할 수 있으며,
메시지를 주고 받으며 공동의 목표를 달성하기 위해 협력하는 객체들의 관계를
설명하기에 적합하다.
또한 실세계의 사물을 기반으로 소프트웨어 객체를 식별하고 구현까지 이어간다는 개념은
객체지향 설계의 핵심 사상인 연결완전성을 설명하는데 적합하다.
카페의 예시를 들어본다.
커피를 주문하는 손님, 주문을 받는 캐시어, 커피를 내리는 바리스타.
하나의 문제를 해결하기 위해서는 다수의 역할이 필요하기 때문에,
하나의 요청은 또다른 요청을 유발하여 연쇄적으로 발생한다.
요청을 받은 사람은 주어진 책임을 다하면서 요청에 응답한다.
요청의 방향과 반대 방향으로 연쇄적으로 전달된다.
사람들은 협력하는 과정 속에서 특정한 역할을 부여받는다.
이 예시에서 객체지향의 몇가지 중요한 개념을 볼 수 있다.
사람을 객체로, 요청을 메시지로, 요청을 처리하는 방법을 메서드로 바꾸면
객체지향을 설명할 수 있다.
협력은 특정 책임을 수행하는 역할들 간의 연쇄적 요청, 응답을 통해 목표를 이루는 것이다.
우리가 사용하는 애플리케이션 또한 기능이 더 작은 책임으로 분할되며 책임이 적절한 역할을 수행할 수 있는 객체에 의해 수행됨으로 이루어진다.
객체지향은 객체에게 적절한 책임을 할당함으로 시작된다.
객체는 협력에 참여하는 주체이다.
객체는 협력에 참여하기 위해 행동을 하며,
행동에 필요한 상태도 함께 지녀야 한다.
객체는 다른 객체가 무엇을 수행하는지 알 수 있지만,
어떻게 수행하는지에 대해서는 알면 안된다.
한 객체가 다른 객체에게 요청하는 것을 메시지 전송,
다른 객체로부터 요청을 받는 것을 메시지 수신이라 한다.
객체지향은 메시지를 전송하는 객체인 송신자와 수신하는 수신자의 관계로 이루어진다.
메서드는 객체가 수신된 메시지를 처리하는 방법을 뜻한다.
메시지를 수신한 객체가 실행 시간에 메서드를 선택할 수 있는 것은 객체지향의 핵심이다.
메시지와 메서드 분리는 객체 간의 자율성을 향상시킨다.
ex) 커피 제조 요청(메시지)을 받은 바리스타는 자신만의 방법으로 커피를 내린다.
캐시어는 커피 방법에 관여하지 않는다.
객체지향은 클래스 정의 방법과 상속만을 이야기 하지 않는다!
객체지향의 목적은 훌륭한 클래스를 식별하는 것이다.
어떤 클래스가 필요한가가 아니라 어떤 객체들이 어떤 메시지를 주고 받으며 협력하는가이다.
객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다.