본 리뷰는 오브젝트, 객체지향의 사실과 오해 책에 대한 리뷰입니다.
읽은 계기
클린 코드 책 읽기 스터디가 끝난 뒤, 다음 주제로 오브젝트 책 읽기 스터디를 진행하였다. 기본적으로는 오브젝트를 읽는 것이 주요 목적이었으나, 해당 책의 경우 객체지향의 사실과 오해 책에서 부족한 부분을 채우는 식이라는 이야기도 있었고, 같은 저자의 책인 만큼 같이 읽어보는 것이 도움이 되리라 생각했다.
객체지향의 사실과 오해(이하 객사오로 표현)는 이전에 반 정도 읽다 말았는데, 이 기회를 통해 완독할 수 있었다.
객체지향에 대한 새로운 접근법
나는 이 책을 읽으면서, 객체지향이란 개념을 이정도로 쥐어 짜서 활용할 수 있구나 같은 생각을 많이 했던 것 같다.
책을 읽기 전, 객체지향에 대한 내 생각은 현실적으로 단점도 많긴 하지만, 대체재가 없는 패러다임이라 생각했다. 분명 객체지향은 머리 속에 생각하고 있는 개념을 추상화하여 코드로 작성하는데 있어 효과적인 전략인 것은 맞지만, 이걸 효과적으로 표현하기 위해 사용되는 boilerplate 코드들이 너무 많고, 객체지향적으로 접근하기 위해 생각하고, 표현하고, 검증하는 과정이 너무 피로하다 생각했다. 그럼에도 불구하고 이를 대체할만한 전략이 없기 때문에 여전히 사용되고 있다고 생각했다. (알 사람들은 알겠지만, 함수형 패러다임은 객체지향을 부정하는 것이 아니므로 논외로 친다.)
특히 책의 내용을 읽으면서, 내가 객체지향이 가진 장점을 100% 활용하지 못하고 있었다는 생각이 들었다. 책에서는 Java를 메인 언어로 설명하고 있다. 나의 경우 객체지향 개념에 대한 이해를 C++로 시작했는데, 알다시피 C++은 객체지향을 시작하기에 그다지 좋은 언어는 아니다. 그래서 책을 읽으면서 새로 깨우친 것 같은 부분을 다른 스터디원들은 당연하게 생각했다는 이야기를 듣기도 했다. 이 분들의 경우 Java, Spring 기반 업무를 맡은 백엔드 개발자분들이라 Java식의 객체지향에 익숙한 부분도 있을 것이고, 기본적으로 Java 자체가 C++에 비해 좀 더 객체지향적인 지원이나 설계가 반영된 언어라서 그런 지도 모르겠다.
책의 구성
책을 읽는 순서를 굳이 매기자면, 객사오 다음에 오브젝트를 읽어야 한다. 두 책의 관계를 굳이 비유하자면, 이론서(객사오)와 실무예제(오브젝트)라고 볼 수 있다.
객사오에서는 흔히 전통적으로 취급하는 객체지향의 관점 (은닉화, 다형성, 상속, 추상화)같은 이야기 위주로 객체지향을 푸는 것이 아니라, 역할, 책임, 협력이란 키워드를 기준으로 객체지향이란 개념을 다시 정의하고 있다. 내가 이해하던 객체지향의 경우, 추상화가 핵심이고 은닉화, 다형성, 상속은 이를 보조하는 도구에 불과하다 생각했다. 하지만 객사오에서 주장하는 바에 따르면 추상화조차도 상황에 따라선 객체지향의 핵심이 아닐 수도 있다는 식의 표현을 하고 있었다. (물론 역할, 책임 개념에서 어느정도 추상화에 대한 부분이 녹아있긴 하다.)
객사오에서 역할, 책임, 협력이라는 주장을 이해했다면, 오브젝트에서는 그 주장을 실제 코드에 적용하는 과정을 보여준다. 객사오는 여러 챕터에 걸쳐 자신의 주장을 펼치지만, 이상한 나라의 앨리스 같은 상황의 예제로 설명하느라, 해당 개념들이 코드에서 어떻게 반영될 지 감이 오지 않을 수 있다. 그에 비해 오브젝트는 이 개념들이 코드로 적용될 때 고려해야할 부분을 상세하게 나눠서 설명한다.
깊은 자료 조사의 흔적
책을 보다 보면 어떤 사람은 어떤 식의 주장을 했다. 어떤 관점에서 이런 이야기를 했다 식의 의견을 인용하는 부분이 많이 나온다. 아무래도 자신만의 관점으로 처음부터 표현하기 위해 그만큼 많은 자료조사를 했겠지만, 필요 이상으로 자료 조사를 많이 하고, 수 많은 지식을 쌓았음을 느낄 수 있었다. 중간에는 도널드 노먼을 인용하기도 하는데, 이 분은 개발 서적보다는 디자인, UX 등에서 자주 접할 수 있는 이름이다. (확인해보니 노스웨스턴 대학 컴퓨터공학과 교수라고는 하지만, 아무래도 유명한건 디자인, UX쪽이다.)
전체적인 레퍼런스를 확인해보니, 저자가 주장하는 역할, 책임, 협력이라는 개념은 Object Design: Roles, Responsibilities, and Collaborations 책에서 제일 많은 영향을 받은 것 같다. 물론 내가 이 레퍼런스를 읽어보진 못했지만, 그렇다고 객사오와 오브젝트가 이 책의 번역판 수준일 것이라고 생각하지는 않는다. 내 생각에 현대적이라 생각하는 접근법인 합성을 통한 설계라던가, 덕 타이핑을 언급하는 부분에서 내용 추가에 대한 고민을 했을 것이라 생각한다.
책의 특징
일단 저자는 본인의 주장을 강력하게 어필한다. 저자의 의견에 동의하지 않는 사람이라면 거부감이 들 수도 있겠지만(나도 초반에는 거부감이 느껴졌다.) 읽다 보면 상당히 근거를 두고 주장을 하기 때문에, 읽다 보면 충분히 빠져들게 될 것이다. 또한 객체지향을 제외한 다른 부분에 대한 언급을 거의 하지 않기 때문에, 객체지향 설계에만 집중하게 되고, 읽으면서 반론이 별로 생각나지 않았다. (이전에 읽은 클린 코드의 경우, 반론 거리가 너무 많아서 매우 공격적으로 독서했던 것에 비해 많이 순응하며 읽었던 것 같다.)
책을 통해 배운 것
이전까지는 객체지향이야기를 할 때마다 따라오는 디자인 패턴에 대해 공부의 필요성은 느꼈지만, 잘 와닿지 않는 문제가 있어, 패턴 공부를 하다 멈추는 경우가 많았다. 특히 Factory 패턴, Strategy 패턴의 경우, 왜 필요한 지에 대해 이해하지 못했고, 예제를 봐도 너무 단편적인 것 같았다. 하지만 이 책을 보면서 왜 이런 패턴이 필요한지 설득되기에 충분한 내용이었다고 생각한다. 또한 해당 패턴을 적용해서 어떤 점이 좋아지는지를 코드만으로 설명하는 것이 아니라, SOLID 원칙을 지키기 위한 방법으로서 주장한다는 점에서 더 많이 와닿았던 것 같다.
1회독만으로도 배운 것은 많지만, 좀 더 완벽히 이해하려면 한 번 이상 더 정독할 필요가 있을 것 같다.
추천 독자
객체지향과 관련된 아니지만 초반에 매우 인상적인 이야기를 하는데, 이론과 실무, 어느 쪽이 먼저일까? 라는 내용으로 이야기를 시작한다. 대충 요약하자면 실무적인 경험을 토대로 이론이 정립된다는 것이다.
나는 객체지향을 학부 2학년때 배웠는데, 최대한 늦게 배워야 한다고 생각하는 사람이다. 못해도 3학년 2학기, 제일 좋은건 취업 전에 필수 과목으로 강의되었으면 싶다. 물론 추상화를 통한 코드 작성 전략은 먼저 가르쳐도 좋지만, 객체지향을 온 몸으로 느끼기엔 충분한 경험이 필요하다 생각한다.
그런 의미에서, 이 책은 졸업반 혹은 갓 졸업한 신입이 읽으면 좋을 것이라 생각하지만, 이걸 이해하고 반영할 수 있는 수준이 되려면 실무에서 1~2년정도는 겪어보면서 왜 내 코드에 발전이 없을까? 같은 생각이 들 때 쯤 읽어보면 좋을 것 같다.