학교 선배들과 함께 진행하고 있는 독서 모임에서 오브젝트
라는 책을 읽게되었다.
나는 독서 모임에서 함께 읽을 책을 찾아보며 이 책을 처음 알게 되었는데 객체 지향 관련 책으로서 꽤나 입지가 높은 책인 것 같다. 객체 지향 설계에 대한 이해를 높이고 싶은 분들이라면 한 번쯤 읽어보면 좋을 것 같다. 개인적으로 이 책을 읽고 공부하면서 느낀 점은 코드를 작성하거나 프로젝트를 진행할 때, 내가 생각한 설계를 정당한 이유를 들어 어필할 수 있게 됐다는 것이다. (아직 완벽하진 않지만!)
이 책에서 정말 많이 나오는 세 단어이다. 역할, 책임, 협력! 객체지향 패러다임의 핵심이라고도 할 수 있다. 객체지향 시스템은 자율적인 객체들의 공동체이다. 따라서, 시스템에서 객체들이 자신이 맡은 여러 책임이 모인 하나의 역할을 수행하면서 협력할 수 밖에 없다. (객체들이 협력 안에서 수행하는 책임들이 모여 하나의 역할이 된다.) 여기서, "자율적인" 이라는 말도 굉장히 중요하다. 협력에 참여하는 객체가 자신의 행동과 상태를 자율적으로 선택할 수 있고 오직 메시지 전송을 통해서 협력한다면 각 객체 내부로 세부 구현을 캡슐화할 수 있기 때문이다. 책임이 적절한 객체를 찾아 책임을 할당하는 것만으로도 좋은 설계를 할 수 있다.
객체지향 시스템을 설계할 때 가장 먼저 생각해야 할 것이 책임이다.
책임은 잘 변하지 않는다. 시스템에서 필요한 책임을 먼저 추려낸 후, 적절한 객체에게 할당하고 각 책임의 구현 내용은 그 책임을 맡은 객체들에게 위임한다. 그리고, 메시지를 통해 해당 책임을 요청하도록 구현한다. 그러면, 자주 변경될 수 있는 구현 내용을 캡슐화하기 훨씬 쉬워진다.
하지만, 설계에 정답이 없는만큼 위 내용을 잘 수행하기란 말처럼 쉽지 않다. 이에 대한 부분은 실제로 코드를 많이 작성하고 많이 설계를 해보는 수 밖에 없을 것 같다.
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질이며 객체지향의 핵심이라고 감히 말할 수 있다. 추상클래스, 인터페이스 등으로 다형성을 실현할 수 있다. 런타임 의존성, 의존성 역전, 추상화 등 책에서 등장하는 주요 용어들이 거의 다형성과 관련 있어 이 글의 소제목으로 꼽아보았다.
- 컴파일 타임 의존성을 고정시키고 런타임 의존성을 변경하자.
- 의존성을 역전시키자.
- 추상화에 의존하자. 구체 클래스보다는 추상 클래스, 추상 클래스보다는 인터페이스에 의존하자.
위 세 가지 모두 이 책에서 강조하는 중요한 토픽들이다. 적어놓고 보니 어떻게 보면 세 가지 모두 다 연결되어 있다고 할 수 있을 것 같다.
슬프게도, 모든 상황에 항상 들어맞는 만능 키는 거의 없다. 설계에서도 역시 마찬가지이다. 이 책에서도 모든 설계는 트레이드 오프임을 강조한다.
- 유연성은 항상 복잡성을 수반한다. 유연할수록 클래스 구조와 객체 구조 사이의 거리는 멀어지고 이해하기 어렵다.
- 상속을 사용하면 타입 계층을 구현할 수 있고 코드 재사용이 가능하지만 결합도를 높인다.
앞서 설명한 좋은 설계를 위한 모든 내용 역시 분명히 들어맞지 않는 상황이 있을 것이다. 그렇기 때문에, 어떠한 설계를 적용했을 때 얻는 장점이 더 크다고 판단되면 적용해야 한다. 이 책을 읽으면서 트레이드 오프를 잘 계산하고 이득이 되는 설계나 기술 스택들을 프로젝트에 적절히 적용할 수 있는 사람이 진정한 좋은 개발자이자 리더가 아닐까 하는 생각이 들었다.
(나 또한 그런 사람이 될 수 있도록 노력해야 겠다!)
ps. 학부 수업 중 소프트웨어 설계 시간에 교수님이 "상속은 그 어떤 관계보다도 두 클래스를 강하게 결합시킨다" 라고 말씀하셨는데 이 책을 읽으면서 왜 그러한지에 대해 더 자세히 알 수 있어서 좋았다.
이 책을 읽으면서 비슷한 이야기를 여러 번 반복한다는 느낌을 받았었는데 책을 완독한 지금 그래서 핵심이 기억에 더 잘 남아있는 것 같기도 하다. 좋은 설계로 가는 길은 멀고도 험하지만 이 책을 통해 조금이나마 코드를 보는 눈이 뜨인 것 같아서 내심 뿌듯하다. 이 책에서 습득한 이론들을 실전에서 써먹을 수 있도록 부단히 노력해야겠다.