
객체지향 설계의 세 가지 관점
개념 관점(conceptual Perspective):
도메인 안에 존재하는 개념과 개념들 사이의 관계를 표현한다.
명세 관점(Specification Perspective):
'사용자'의 영역인 도메인을 벗어나 '개발자'의 영역인 소프트웨어로 초점이 옮겨진다. 이 관점은 객체의 인터페이스를 바라본다. 각 객체가 협력을 위해 '무엇'을 할 수 있는가에 초점을 맞춘다.
구현 관점(Implementation Perspective):
프로그래머 입장에서 가장 익숙한 관점으로, 실제 작업을 수행하는 코드와 연관돼 있다. 구현 관점의 초점은 객체들의 책임 수행을 위해 동작하는 코드를 작성하는 것이다.
이 세 가지 관점이 중요한 이유는, 이 세 가지 관점을 가지고 동일한 클래스라도 이 관점에 맞추어 바라볼 줄 알아야, 좋은 객체지향 설계를 이루어 낼 수 있기 때문이다. 코드 안에서 세 가지 관점을 쉽게 식별할 수 있도록 깔끔하게 분리해내어야 한다.
이 세 가지 관점을 어떻게 활용하여 좋은 객체지향 설계를 이루어 낼 수 있는지를 실세계의 커피 전문점을 예시로 들어 설계를 직접 해보도록 하자.
커피 전문점 도메인

먼저 커피 전문점에 무슨 객체가 있는지 살펴보자.
가장 먼저 '메뉴 항목'이라는 객체를 담고 있는 '메뉴판' 객체가 존재할 것이고, 메뉴판을 읽고 커피를 주문하는 '손님' 객체, '커피'객체, 그리고 이 커피를 제조하는 '바리스타' 객체가 존재할 것이다.
실세계의 객체를 소프트웨어 적인 관점의 객체로 가져오기 위해선, 명시하고 넘어가야 할 중요한 사실이 있다. 바로 '동적인 객체를 정적인 타입으로 추상화해서 복잡성을 낮춰야 한다'는 것이다.
메뉴 항목 객체는 메뉴판 객체에 포함되는 관계를 지닌다. 이를 '포함' 또는 '합성' 관계라고 하고, 포함관계가 아닌, 단순히 서로 알고 있어야 할 경우를 '연관'관계라고 표현한다.
객체지향의 세계는 협력하는 자율적인 객체들의 공동체라는 점을 기억하자. 적절한 객체에 적절한 책임을 할당해야 한다. 이 단계에서 중요하게 짚고 넘어가야 할 부분은 객체들 간의 관계를 잘 파악해야 한다는 것이다.
훌륭한 협력 관계 설계하기
훌륭한 설계란, 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택하게 해야 한다. 즉, 메시지를 먼저 선택하고 그 후에 메시지를 수신하기에 적절한 객체를 선택해야 한다는 것을 의미한다.
예를 들면, 커피를 주문할 책임을 지는 객체는, 손님이다. 또 손님은, 자신이 선택한 메뉴 항목을 메뉴판에게 제공해달라는 요청을 할 책임이 있다.

현실 속에서 메뉴판은 그저 손님에게 의해 펼쳐지고 닫혀지는 수동적인 존재이다. 하지만, 객체지향의 세계로 들어온 메뉴판은 더 이상 수동적인 존재가 아니다. 객체지향의 세계에서는 모든 객체가 능동적이고 자율적인 존재이다. 마치 생명을 가진 존재처럼 자기 스스로 메뉴 항목을 찾는다.
인터페이스 정리하기
객체가 수신한 메시지의 객체의 인터페이스를 결정한다. 객체의 타입을 구현하는 일반적인 방법은 '클래스'를 이용하는 것이다.
클래스의 인터페이스를 식별하고 나서는, 구현 단계로 들어가야 한다. 어떤 메서드를 써서 오퍼레이션을 수행할지를 결정해야 한다. 개발하는데 있어 제일 중요한 단계는 설계가 아닌, 이 구현단계이다. 설계는 최대한 빨리 끝내고, 바로 구현 단계로 들어와 설계에 이상이 없는지, 설계가 구현 가능한지를 판단해야 한다. 또한, 객체지향의 특성인 '캡슐화'를 잊지 않고, 불필요한 정보가 외부에 보이지 않도록 해야한다.

최종적으로 구현한 클래스 다이어그램은 이와 같다.
코드와 세 가지 관점
이러한 세 가지 관점을 바탕으로 설계를 이루어내면, 변경을 관리하기 쉽고 유지보수성을 향상시킬 수 있다. 소프트웨어 클래스와 도메인 클래스 사이의 간격이 좁을수록 기능을 변경하기 위해 뒤적거려야할 코드의 양이 줄어든다. 또한, 메서드의 구현과 속성의 변경은 원칙적으로 외부의 객체에 영향을 미쳐서는 안된다.
여러 개의 클래스로 기능을 분할하고 클래스 안에서 인터페이스와 구현을 분리하는 이유도 변경이 발생했을 때 코드를 좀 더 수월하게 수정할 수 있다. 시스템의 '유지보수성'은 객체지향 설계에서 언제나 중요한 부분이 될 수 밖에 없다.