*파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

이 책은 객체지향 설계의 본질을 깊이 있는 철학적 접근과 현실적인 사례를 통해 설득력 있게 전달한다. 특히 시니어 엔지니어 관점에서 보았을 때, 객체지향을 단순히 프로그래밍 언어나 기술적 기교로 이해하는 것이 아니라, 협력과 책임이라는 인간 사회의 본질과 닮은 개념을 중심으로 접근하는 방법론이 인상적이다.

개념과 설계를 명세와 구현과 명확히 구분하여 설계를 진행하는 접근은 실제 업무에서 유지보수성과 변경 대응 능력을 극대화하는 실질적인 가이드를 제공한다. 특히, 책임 주도 설계와 메시지 중심의 접근 방식은 팀 내 코드 리뷰와 아키텍처 설계에 직접적으로 활용 가능한 가치 있는 통찰을 제공한다.

한편, 객체지향을 과도하게 기술적이고 복잡한 개념으로 설명하지 않고, 비유와 은유를 통해 쉽게 이해할 수 있도록 구성한 점이 돋보였다. 이를 통해 팀원과 소통할 때 객체지향의 본질을 쉽게 전달하고 설계 의도를 명확히 공유할 수 있게 된다.

결론적으로 이 책은 시니어 엔지니어들이 실무에서 객체지향 설계의 원칙을 보다 명료하게 이해하고, 코드의 품질과 협력적 설계를 높이는 데 큰 도움을 줄 수 있는 필독서라 평가할 수 있다. 객체지향을 처음 접하는 초급자뿐 아니라 설계에 숙련된 개발자에게도 지속적으로 참고할 가치가 있는 뛰어난 지침서이다.

1장. 협력하는 객체들의 공동체

객체지향 설계는 자율적인 객체들이 서로 협력하는 방식으로 문제를 해결하는 방식을 강조한다. 예를 들어, 카페에서 커피를 주문하는 과정에서 고객, 캐셔, 바리스타라는 각 객체가 명확한 역할과 책임을 수행하며 메시지를 주고받는다. 고객은 커피를 주문하고, 캐셔는 주문을 받고, 바리스타는 주문된 커피를 제조한다. 각 객체는 요청과 응답이라는 메시지 교환을 통해 협력하며 전체 시스템이 원활히 작동하도록 한다.

2장. 이상한 나라의 객체

객체는 상태(속성), 행동(메서드), 식별자를 가진 자율적 존재이다. 이 개념은 “이상한 나라의 앨리스”를 통해 설명된다. 예를 들어 앨리스라는 객체는 ‘키’라는 상태와 ‘먹는다’는 행동을 통해 자신의 상태를 변화시킨다. 객체가 가진 상태는 그 객체의 행동 결과로 나타나며, 식별자는 객체가 서로 다름을 명확히 한다. 이렇게 상태와 행동을 통해 객체가 스스로 결정하고 행동하는 자율적 존재임을 강조한다.

3장. 타입과 추상화

추상화는 복잡한 현실을 간단한 개념으로 정리하여 이해를 돕는 것이다. 예를 들어, 카드게임에서 ‘트럼프 카드’라는 개념을 타입으로 정의하면 스페이드, 하트 등의 구체적인 카드들을 하나의 범주로 묶어 관리할 수 있다. 타입을 통해 공통된 행동(뒤집기, 섞기 등)을 정의하고, 객체를 이 타입으로 묶어서 간편하게 다룰 수 있게 한다. 이를 통해 객체 설계가 더욱 명확하고 유지보수가 용이해진다.

4장. 역할, 책임, 협력

객체지향 설계는 역할과 책임에 따라 객체 간 협력을 정의한다. 예로, 법정 재판 상황을 생각해보자. 판사, 증인, 피고인 등은 각기 다른 역할을 가지고 있으며 그에 맞는 책임을 진다. 판사는 판결을 내리는 책임을, 증인은 진술할 책임을, 피고인은 방어할 책임을 진다. 이처럼 명확한 역할과 책임을 설정하면 시스템 내 객체의 협력이 원활해지고 유연성이 높아진다.

5장. 책임과 메시지

객체가 협력하기 위해 주고받는 요청을 메시지라 하며, 객체는 메시지를 받아들여 이를 수행하는 책임이 있다. 레스토랑의 웨이터가 주방장에게 “스테이크를 구워라”라는 메시지를 보내면 주방장은 이 요청을 받고 자신만의 방식(메서드)으로 음식을 준비한다. 객체 간 메시지 전달은 인터페이스로 정의되고, 이를 통해 구현 세부 사항을 숨겨 객체의 결합도를 낮추고 자율성을 높인다.

6장. 객체 지도

객체지향 설계는 시스템의 기능(유스케이스)과 구조(도메인 모델)를 명확히 구분한다. 예를 들어 온라인 쇼핑몰을 구축할 때, 도메인 모델(상품, 고객, 주문)은 시스템의 안정적인 구조를 제공하고, 유스케이스(장바구니 담기, 주문 결제)는 기능적 요구사항을 담는다. 기능이 변경되더라도 안정적인 도메인 모델 덕분에 유연하게 대응할 수 있다.

7장. 함께 모으기

실제 구현을 할 때는 세 가지 관점에서 접근한다: 도메인의 개념적 관점, 협력의 명세적 관점, 구현적 관점이다. 카페 주문 시스템을 구현한다고 하면, 개념적 관점에서 ‘커피’, ‘메뉴’ 등 도메인 개념을 정의하고, 명세적 관점에서 객체 간 주고받을 메시지(주문받기, 커피제조)를 명확히 하고, 마지막으로 구현 관점에서 실제 코드로 각 객체의 책임을 구현한다. 이 세 가지를 잘 구분하고 통합하면 유지보수가 쉬운 견고한 설계를 달성할 수 있다.