이 순서대로 구현하라는 것이 아니라, 동일한 코드를 각기 다른 세 가지 관점에서 볼 수 있다는 것을 의미한다. "이 코드는 무슨 일을 하고 있나요?"라는 질문에 도메인(비즈니스 로직)의 관점에서 답할 수도 있고, 객체들의 역할/책임/협력 관점에서 답할 수도 있고, 순수하게 구현된 코드의 동작으로 답할 수도 있을 것이다.
인터페이스와 구현을 분리하라!
이 책에서 거듭 강조하는 표현이다. 예시를 들어 설명하자면 이렇다.
예를 들어, 차종이 달라져도 같은 자동변속기 차량이라면 대부분의 사람들은 운전하는 데 별 문제가 없다. 차량 내부의 구현 방식은 달라도, 운전자 입장에서는 굳이 구현 방식이 어떻게 달라졌는지 알 필요가 없다. 자동변속기라는 인터페이스가 같다면, 운전자는 같은 행위를 통해 차량을 운전할 수 있다.
만약 인터페이스와 구현이 명확히 분리되어 있지 않다면, 구현이 변경되어야만 하는 상황에 놓였을 때 인터페이스도 변경될 수 있으며, 사용자는 변경된 인터페이스에 맞춰서 행위를 변경해야 한다.
사실 부록이지만 이 책에서 말하는 핵심 내용들이 부록에 다 담겨 있는 것 같다.
"무엇"을 추상화하느냐에 따라 아래 세 가지 기법 중 하나를 선택할 수 있다.
각 추상화 기법은 공통적으로, 복잡성을 낮추기 위해 사물의 특정한 측면을 감춘다.
객체지향에 대해 처음 공부했을 당시에 객체, 클래스, 인스턴스 등 처음 접하게 되는 개념들이 많아서 헷갈렸는데, 특히 '인스턴스'처럼 영어 단어를 그대로 음차한 단어 같은 경우 한 번에 뜻이 잘 와닿지 않는 경우가 많은 것 같다.
인스턴스를 확실하게 이해하게 됐던 계기는, 문득 영어 시간에 "For instance"가 "예를 들어" 였던 게 생각난 것이었다. 저 문장 앞에 어떤 개념에 대한 설명이 있고, 그 개념의 예시를 들 때 "For instance, ~~"라고 하니까, "앞에서 말한 개념의 실제 사례"라는 의미로 연결됐다.
여기서 한 번 더 든 생각이, "EC2 인스턴스"라는 표현이 있었는데, 이 때 인스턴스도 저런 의미에서 사용된 것인지 궁금해져서 GPT한테 물어봤더니, 내 생각이 맞았다.
EC2 인스턴스: AMI/런치 템플릿(기본 이미지+설정)을 바탕으로 띄운 구체적인 가상 서버 한 대. 시작할 때마다 서로 다른 인스턴스 ID(i-...)를 가진 별개의 머신.
덕분에 AMI/런치 템플릿이라는 게 있었구나도 다시 짚게 되었다.
마치 우리가 어떤 새로운 개념을 접했을 때 사전에서 그 뜻을 찾아보면, 그 정의가 내연이고, 예시가 외연이며, 그러한 정의에 해당하는 것을 부르는 단어를 심볼이라고 생각하면 될 것이다.
이 책에서 거듭 강조하는 또 다른 말은 클래스와 타입이 같은 개념이 아니라는 것이다. '타입'이라는 개념을 구현하기 위한 방법 중의 하나일 뿐이라는 것이다.
실제로 자바스크립트의 경우 클래스 대신 프로토타입이라는 개념을 이용해 타입을 구현한다. (ES6에서 클래스도 도입되었다)