
퇴근 후 개인 프로젝트를 진행하며 다시 한번 객체지향적 사고를 정립하고 도메인을 중심으로 한 설계를 진행해 보고자 이 책을 선택했다. 유지보수가 쉽고 재사용이 용이한 프로젝트가 탄생하기를 기대해 본다.
애플리케이션을 협력하는 객체들의 공동체가 아닌 클래스로 구성된 설계도로 보는 과정은 유연하고 확장 가능한 애플리케이션의 구축을 방해한다.
(중략)
클래스는 협력에 참여하는 객체를 만드는 데 필요한 구현 메커니즘일 뿐이다. (p. 38)
1장에서 자세하게 객체지향의 의미와 다양한 특성들을 소개했지만 가장 인상 깊은 구절이었다.
나를 포함한 많은 사람들이 객체지향을 바라보는 요소를 자연스럽게 클래스로 정의하고 있다는 것에 동의한다.
리터럴리 객체지향은 자율적으로 존재하는 객체들의 상호작용으로 이루어진 시스템이다.
쉴 새 없이 반복하며 강조되는 객체의 필수 요소들을 다음과 같이 정리했다.
- 역할, 책임, 협력의 의무
- 요청과 응답의 연쇄
- 상태와 행위로 이루어짐
- 스스로 통제하며 차단하는 자율성
- 메시지와 메서드 내재
객체들이 위 항목들을 충분히 만족해야 비로소 “객체지향 프로그래밍”을 시작할 수 있을 것이다.
다음은 개발을 진행하며 명시하고 있으면 좋은 사실이다.
- 여러 사람이 동일한 역할을 수행할 수 있다.
- 역할은 대체 가능성을 의미한다.
- 한 사람이 동시에 여러 역할을 수행할 수 있다. (p. 28)
객체는 상태와 행위를 묶은 하나의 단위이기 때문에 사실상 who는 중요하지 않다는 것이다. 때문에 역할은 대체될 수 있으며 심지어는 한 객체가 여러 역할을, 여러 객체가 한 역할을 수행할 수 있다.
그리고 다형성.
- 책임을 수행하는 방법은 자율적으로 선택할 수 있다. (p. 28)
동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 객체의 능력을 의미한다. 변화에 유연한 소프트웨어를 만들기 위해서 객체 지향 패러다임을 사용하는 것이라면, 그러한 목적 달성에 중추적인 역할을 “다형성”이 해낸다. 우리가 익숙하게 오버로딩 및 오버라이딩을 구현할 수 있는 이유다.
관련 링크 # 다형성(Polymorphism)이란?