1장. 협력하는 객체들의 공동체
"시너지를 생각하라. 전체는 부분의 합 보다 크다" - 스티븐 코비
Last updated
"시너지를 생각하라. 전체는 부분의 합 보다 크다" - 스티븐 코비
Last updated
객체지향과 실세계는 일 대 일로 정확히 매칭 되는 구조가 아니다.
그럼에도 불구하고 실세계와 비유하는 이유는 인간이 이해하기 가장 쉬운 개념인 "언어" 체계 기반의 추상화 개념이 적용 되어 이해를 돕기 때문에 학습을 위해 실세계와 매칭 하게 된 것이다.
문제를 해결 하는 프로세스에서 각 객체 간 역할, 책임, 협력을 통해 문제를 해결한다. 위 그림에서 볼 수 있는 역할 관계는 아래 내용과 같다.
캐시어: 주문을 받아야한다.
바리스타: 커피를 제조해야한다.
손님: 캐시어에게 커피 메뉴를 주문 해야한다.
위에서 실세계와 비유 하여 객체지향의 포괄적인 의미를 이해 하는데 힌트를 얻었다. 앞으로 객체지향을 프로그래밍의 문맥으로 옮기면 아래와 같다.
사람 -> 객체
요청 -> 메시지
요청을 처리 하는 방법 -> 메소드
인간은 목표를 달성하기 위해 협력 하지만, 객체는 어플리케이션의 기능을 구현 하기 위해 협력 한다. 그래서, 애플리케이션의 디자인을 아름답게 만들기 위해서 객체에게 얼마나 적절한 책임을 부여하는가를 중요하게 여겨야 한다.
협력
객체는 언제나 열린 마음으로 다른 객체에게 적극적으로 도움을 요청할 줄 알야야한다.
만약, 외부의 도움을 모두 무시한 채 스스로 전부 구현한 전지전능한 객체를 설계 했다면 나중에 복잡도로 인해 스스로 자멸하게 될 것이다.
자율
객체는 자기 스스로 어떠한 원칙에 따라 행동 하고 스스로를 통제 하는 자율성이 필요하다.
스스로 행동하고 통제 하기 위해서 상태와 행동을 객체 스스로 지니고 있어야 한다. 이러한 자율성은 객체의 내부세계와 외부 세계를 철저히 분리 했을 때 나타난다.
객체의 외부 세계에서는 접근이 허락 된 메서드를 통해 의사소통 해야 하며, 무엇을 수행하는지 알 수 있지만 어떻게 수행 하는지는 알 수 없다.
이처럼 외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 "메서드"를 분리하는 것이 객체의 자율성을 높이는 매커니즘이다.
💡 따라서, 객체는 상태와 행위를 하나로 묶는 자율적인 존재이다.
훌륭한 객체 지향을 설계 하기 위해 거쳐야 할 것은 코드를 담는 클래스의 관점에서 메시지를 주고 받는 객체의 관점으로 사고를 전환 하는 것이 필요하다.
객체가 갖고 있는 속성 값에 직접 접근 하지 말자. 우리는 객체를 훨씬 더 존중해야한다.