5장은 객체지향 설계에 있어서 메세지의 중요성과 책임의 자율성을 강조한다. 손님이 바리스타에게 커피를 주문하는 과정을 협력의 예시로 들어보자. 이 협력에서는 '커피를 만들어라' 라는 말이 메세지가 된다. 저자는 객체 지향 설계가 이 메세지를 정하는 것으로부터 시작되어야 한다고 말한다. 메세지의 송/수신자의 관점에서 수신자인 바리스타는 오직 '커피를 만들어라' 라는 메세지가 수신될때만 행동을 하게 된다.
인터페이스
이번장에서는 인터페이스의 개념이 등장한다. 인터페이스는 객체들이 협력하는 통로가 되어준다. 실생활의 예시 중 노트북을 예시로 들었을때 우리는 키보드에 타자를 침으로써 노트북과 의사소통 한다. 책에서 소개하는 인터페이스의 특징을 살펴보자.
- 인터페이스의 사용법을 익히기만 하면 내부 구조나 동작 방식을 몰라도 쉽게 대상을 조작하거나 의사를 전달할 수 있다.
- 인터페이스 자체는 변경하지 않고 단순히 내부 구성이나 작동 방식을 변경하는 것은 인터페이스 사용자에게 어떤 영향도 미치지 않는다.
- 대상이 변경되더라도 동일한 인터페이스를 제공하기만 하면 아무런 문제 없이 상호작용 할 수 있다.
위의 세가지 특징을 노트북 예시에 적용해보자.
먼저 우리는 키보드의 내부 구조가 어떻게 생겼는지에는 관심이 없다. 멤브레인 식이냐 기계식이냐로 갈릴 수 있겠지만 노트북과 소통하는데 있어서는 아무런 영향을 미치지 않는다. 단지 키보드를 누르기만 하고, 키보드 위에 적힌 기호들을 이해해서 조합하기만 하면 노트북과 소통할 수 있다.
다음으로 키보드의 동작 방식을 변경한다고 해서 우리가 노트북을 사용하는데 있어서는 영향을 미치지 않는다. 위에서 말한대로 멤브레인 키보드를 기계식으로 변경한다고 해서 노트북과 소통하는 방식이 180도 달라지지는 않는다. 타건감에 차이가 있을 수 있겠지만 소통 자체에 문제가 있는건 아니지 않은가?
마지막으로 노트북 기종이 변경된다 하더라도 우리는 키보드만 정상적으로 달려있다면 노트북과 상호작용 할 수 있다. 삼성 FLEX 노트북이 LG 그램으로 바뀐다고 해서 소통 방식이 바뀌지 않는것 처럼 말이다.
다시 손님과 바리스타의 예시로 돌아와서, 저자는 인터페이스의 구성은 메세지를 따라야 한다고 말한다. 즉 메세지들을 가지고 인터페이스를 구성해야 한다는 것이다.
바리스타라는 인터페이스를 구현하는 상황을 생각해보자. 손님이 송신하는 메세지가 '커피 만들어줘' 와 '커피 추천해줘' 라는 걸 정한 후, 인터페이스는 이 두가지 책임을 구성해야한다. 만약 메세지에 대한 파악 없이 바리스타에 대한 상상으로 인터페이스를 구성한다면 불필요한 기능들이 인터페이스에 많이 추가될 것이다. 맷 와이스펠드의 인터페이스에 대한 원칙 중 '최소 인터페이스'라는 것이 있다. 최소한의 중요한 책임만을 명시한 인터페이스를 만드려면 송/수신되는 메세지를 먼저 고려해야 한다.
인터페이스와 구현의 분리
인터페이스에 있어서 외부와 내부의 완벽한 분리도 중요한 지점이다. 여기서 외부는 인터페이스(저자는 공용 인터페이스라 지칭한다.) 이고 내부는 구체적인 행동인 메서드와 상태가 정의된 객체이다. 우리는 내부를 구현이라는 말로 부를 수 있다. 인터페이스와 구현을 분리하면 어떤 이점을 얻을 수 있을까?
먼저 변화에 있어서 자유롭게 된다. SOLID 원칙에서 OCP (개방 폐쇄 원칙)과 일맥상통하는 내용이다. 인터페이스를 구현하는 객체는 얼마든지 바뀔 수 있다. 기존에 일을 하던 바리스타가 해고 당하고, 새로운 바리스타가 올 수도 있다. 하지만 손님은 그 변화에 전혀 영향을 받지 않는다. 단지 '커피 만들어줘'라고 메세지를 보낼 뿐이다.
또한 바리스타들은 커피를 만들어야 한다는 책임에 있어서 구현방식을 모두 다르게 할 수 있다. 바리스타마다 커피를 드립으로 내리는걸 좋아할 수도 있고, 커피 머신으로 만드는걸 좋아할 수도 있다. 어떤 방식으로 만들던지 커피를 만들어주기만 하기 때문에 책임의 자율성을 보장할 수 있다.
또한 캡슐화를 이룰수도 있다. 단지 커피만 만들어주면 되기 때문에 굳이 손님한테 커피를 만드는 과정을 모두 보여줄 필요가 전혀 없다. 본인의 구체적인 커피 제작 방식은 꽁꽁 숨길 수 있는 것이다.
인터페이스와 구현의 분리를 통해 얻을 수 있는 이점을 간단히 요약하자면,
- 적절한 추상화를 이룰수 있다.
- 응집도가 높아진다.
- 객체간 결합도가 낮아진다.
- 캡슐화가 증진된다.
- 설계의 유연성과 재사용성이 확장된다.
핵심
5장에서 말하고자 하는 핵심을 한 문장으로 말해보자
1. 메세지에 따라 인터페이스를 구성함으로써 명확한 책임을 부여하자.
2. 책임을 자율적으로 만드는것이 객체지향 설계를 아름답게 하는 출발점이다.