이 게시글에서는 "객체지향의 사실과 오해"를 읽으면서 얻은 생각들을 기록하려고 한다. 나중에 성장한 후, 현재의 나를 되돌아볼 수 있도록 지금의 생각을 그대로 담아 두서없이 작성할 예정이다.
"객체지향의 사실과 오해"를 읽게 된 이유는 단순하다. 이전에 읽었던 [책] "자바 객체지향의 원리와 이해" 후기를 통해 객체지향에 대한 기본적인 개념을 쌓았지만, 실제로 객체지향적으로 사고하는 방법까지는 깊이 이해하지 못했다.
그래서 좀 더 전문적인 도서를 읽어보자고 결심했고, 그 결과로 선택한 것이 "객체지향의 사실과 오해"였다. 이 책을 읽으면 객체지향적으로 사고하는 방법을 확실히 배울 수 있을 것이라 기대했지만, 현실은 예상과 달랐다.
"객체지향의 사실과 오해"는 이 책 한 권을 읽는다고 해서 개발 실력이 눈에 띄게 향상된다거나, 더 나은 프로그램을 작성하게 되는 것은 아니라고 단언한다. 그럼에도 이 책의 목표는 분명하다. 책을 덮은 후, 지금까지의 개발 방식을 되돌아보고 깊이 생각할 수만 있다면, 그 목적을 다한 것이라고 한다.
이러한 목적에서 당연하게도, 책을 읽으며 느낀 것은 이 책이 정답을 알려주는 것이 아니라는 것이다. 객체지향이라는 모호한 개념을 명확하게 정의하기보다는, 중요한 부분들을 반복적으로 강조하고 쉽게 설명하려 노력한다. 처음에는 충격적이었다. 개발자인 나는 코드가 직관적이라고 생각하는데, 이 책은 추상적인 이야기만을 반복하는 듯했다. 저자가 기술적인 내용을 비기술적인 서술로 풀어내는 데 너무 집중한 듯한 느낌을 받았다.
그렇다고 해서 이 책이 아무런 성과를 남기지 않은 것은 아니다. 객체지향에 대해 새로운 관점들을 많이 얻게 되었다. 예를 들어, 프로그램은 현실 세계를 그대로 모방하는 것이 아니라, "은유"해야 한다는 것, 객체지향의 중심은 클래스가 아니라 객체라는 것, 데이터를 중심으로 사고하는 것이 아니라 행동을 중심으로 생각해야 한다는 점, 그리고 객체는 자율적이어야 한다는 사실 등 많은 통찰을 얻을 수 있었다.
특히 가장 큰 깨달음은, 내가 작성하는 프로그램이 반드시 현실 세계를 그대로 따라가야만 한다는 강박에서 벗어나게 된 점이다. 현실 세계와 프로그램이 다를 수 있다는 것을 인정하니, 더 유연한 설계가 가능해졌고, 이전보다 창의적인 해결책을 구상할 수 있게 되었다. 이 책을 읽기 전까지는 실제로 현실 세계를 그대로 반영해야 한다는 고정관념 때문에 더 나은 설계를 선택하지 않은 적도 있었다.
책을 덮고 나니 저자가 의도한 대로, 깊은 사색에 빠졌다. 그러나 생각에만 그칠 뿐, 명확한 결론을 내리는 데는 어려움이 있었다. 그래서 joon6093/Spring_Study : Java-OOP_Study에서 볼 수 있듯이, 책에서 배운 내용을 바탕으로 실제 프로그램을 구현해보며 객체지향 사고를 몸으로 익히고 있다. 도메인 모델을 먼저 설계하고, 메시지 기반으로 책임을 분배한 후, 협력과 역할, 책임을 고민하면서 코드를 리팩토링하고 있다. 이러한 과정에서 나름대로 만족스러운 결과물을 얻고 있지만, 이 방식이 과연 옳은 방향인지에 대한 확신은 아직 들지 않는다.
물론 객체지향에 정답은 없겠지만, 잘못된 방향은 분명 존재할 것이다. 이와 관련된 다른 책을 찾던 중, 같은 저자가 쓴 "오브젝트"라는 책을 발견했다. 이 책은 객체지향 설계를 실제 코드로 풀어내는 것에 중점을 두고 있다. "객체지향의 사실과 오해"가 이론적인 개념에 대한 이해와 사고 방식을 다루는 책이라면, "오브젝트"는 객체지향 설계의 원칙들을 구체적인 코드 예시를 통해 설명한다.
따라서 "오브젝트"를 읽으면, 앞서 읽었던 "객체지향의 사실과 오해"에서 다룬 추상적인 개념들이 어떻게 실제 코드로 구체화되는지를 명확하게 이해할 수 있을 것이라고 예상한다. (나와 같이 생각한 개발자가 많았고 이런 이야기를 많이 들었기 때문에 저자께서 "오브젝트"를 출판하시게 된걸까?)
그래서 "오브젝트"까지 읽고 나면, 객체지향에 대한 나만의 결론을 내릴 수 있을 것이라 기대하고 있다. 객체지향은 쉬우면서도 어려운 것 같다...