본문 바로가기

개발 도서 리뷰/개발 도서 리뷰

개발 도서 리뷰 (2) 객체지향의 사실과 오해 _ 4.5/5.0

 

객체지향의 사실과 오해

나의 평점 4.5/5.0

 

 

추천합니다.

Class나 Prototype 얘기만 나오면 이유 없이 가슴이 답답해지는 프론트엔드 개발자분.

Child extends Parents 같은 무의미한 비유로 배우는 객체지향이 지긋지긋하신 분.

자바 혹은 이외의 객체지향 프로그래밍 언어를 배울 예정이신 분.

 

추천하지 않습니다.

실질적인 예제 코드 및 설계 기법을 배우고 싶은 분.

 

 

 

 

자바를 공부하게 됨에 따라 강제적으로 객체지향 프로그래밍을 배울 수 밖에 없었지만, 프론트 개발을 먼저 접한 나에게 객체지향은 너무나도 멀게 느껴지는 단어였다.

실제로 프론트 개발 관련 오픈톡방에는 현업에 종사하시는 주니어 개발자 분들도 Class만 나오면 일단 겁먹고 보는 분들이 엄청나게 많고, Prototype에 대해서 대략적인 개념은 알아도 설명할 줄 아는 사람이 별로 없다.

( 물론 객체 지향의 사실과 오해를 읽으면 알 수 있겠지만 "Class"나 "Prototype"은 객체 지향의 핵심이 아니다. )

프론트에서는 레거시 프로젝트를 수정하는 것이 아닌 이상 클래스를 사용할 일이 거의 없으며, 함수형 프로그래밍을 기반으로 코드를 작성하기 때문에 당연한 일이다.

나도 한창 공부하던 당시 "현업에서 클래스 사용하나요?"라고 질문했을 때 연차가 얼마 되지 않은 개발자분들 중에서는 클래스를 구경조차 해본 적 없다는 분들이 많았다.

 

하지만 이렇게 객체지향에 대해 외면하고 넘어가는 프론트 개발 취준생들의 마음 한 켠에는 언젠가 이 무시무시한 괴물 같이 느껴지는 객체지향이라는 것을 언젠가는 알고 넘어가야 한다는 압박감이 자리잡고 있을 것이다.

그런 객체지향에 대한 알 수 없는 두려움에 지배당하고 있는 프론트엔드 개발 취준생, 혹은 객체지향 프로그래밍 언어를 공부하고 있는 모든 사람에게 이 책을 추천하고 싶다.

특히나, 나는 자바를 처음 배우려는 사람들이 이 책을 챕터 5까지 읽은 뒤 자바를 공부했으면 좋겠다. 기존에 자바를 공부한 사람들이 이 책을 읽고나면 기존에 객체지향을 배울 때 고통스러웠던 사람들은 왜 이렇게 쉬운 개념을 그토록 어렵게 배웠어야 했는지에 대해 화가 날 수도 있다.

 

이 책의 목차는 다음과 같다.

 

Chapter1 _ 협력하는 객체들의 공동체

Chapter2 _ 이상한 나라의 객체

Chapter3 _ 타입과 추상화

Chapter4 _ 역할, 책임, 협력

Chapter5 _ 책임과 메세지

Chapter6 _ 객체 지도

Chapter7 _ 함께 모으기

Appendix_ 추상화 기법

 

챕터 1부터 챕터 4까지는 협력 - 책임 - 역할의 관점에서 객체지향을 풀어나간다.

1. Class는 객체 지향의 핵심이 아니며 구현하기 위한 추상화 도구일 뿐이다.

2. 객체의 행동을 먼저 생각하지 말고 전체 객체들이 이뤄내야할 목표(협력)과 그 협력 과정에 필요한 행위들(책임)을 먼저 생각하라.

3. 협력과 책임이 모두 주어졌다면, 그 다음에서야 정해지는 것이 책임을 가질 객체다.

이 세 가지 원칙에 의거하여 비슷한 내용이 점점 확장되며 4장까지 반복되기 때문에 어느 정도 읽은 시점에서 "어.. 너무 우려먹는 거 아닌가?"라는 생각이 들 수도 있으나 그게 다 5,6,7장과 부록<추상화 기법>을 위한 빌드업이다.

 

5장에서는 메시지와 메서드를 사용해서 어떻게 객체가 책임을 수행하면서도 자율적으로 행동하고, 객체간의 느슨한 연결을 유지하며, 객체의 응집도를 강하게 하고, 유연하고 재사용 가능한 어플리케이션을 설계할 수 있는지 이야기한다.

 

6장에서는 도메인(Domain)과 유스 케이스(Use case)의 정의와 설계하는 방법을 간단하게 배우고 7장에서는 지금까지 배운 내용들을 결합하여 도메인(설계 관점), 인터페이스(명세 관점), 메서드 및 상태(구현 관점)에서 어떻게 애플리케이션을 설계하는지, 그리고 이 과정에서 책임과 협력, 역할이 어떻게 적용되는지 실제로 확인할 수 있다.

 

마지막으로 부록 챕터인 <추상화 기법> 파트는 객체지향에서 어떤 것을 근거로 객체를 추상화하는지에 대해 다루는데, 이 챕터에서 다루는 내용들은 "당장 중요하진 않은데 내 마음 속 한 켠에 의문으로 남아있던" 것들을 한 번에 해소시켜주는, 나에게는 가장 가치있는 챕터였다.

 

 

Interface와 Abstract의 차이는 무엇인가? - - 22/08/07 내용 추가

인터페이스와 추상클래스의 차이는 무엇일까? 물론 기능적인 차이는 누구라도 이야기할 수 있을 것이다. 1. 인터페이스는 완성된 메서드를 정의할 수 없다. 2. final 키워드는 추상 클래스는 사용

7357.tistory.com

( 그 중 하나를 이 글에 추가적으로 작성했다. )

 

이 책을 다 읽고나서 든 생각은 "아.. 비유로 객체지향을 가르치려면 이 정도 깊이로는 가르쳐야하는 구나"였다.

"Class Child는 Parent를 상속할 수 있다. 이게 객체 지향이다. 완전 편리하죠?" 이런 아무짝에 도움도 안되는 비유로 가르치는 교육 방식을 굉장히 안 좋게 생각하고 있었는데, 저자는 1장부터 그런 식으로 가르치는 건 의미도 없고 애초에 클래스나 상속이 객체지향의 핵심도 아니며 객체지향은 현실 세계의 추상화가 아니라고 못을 박고 시작한다.

그리고 1장부터 5장까지 왜 객체지향에서 중요한 것은 클래스가 아니라 책임과 메시지인지에 대해 수도 없이 반복하고 확장하며 설명해주고, 6장 7장에서 지금까지 주장해온 것들을 납득시킨다.

 

나처럼 기존의 객체지향에 대한 교육 방식에 큰 불만을 가지고 있는 사람이라면 꼭 이 책을 읽어보기를 권한다, 내가 이 책을 진작 읽었다면 자바스크립트를 공부할 때도 클래스를 무서워하지 않았을 텐데, 자바의 객체지향 파트도도 훨씬 수월하게 배웠을 텐데라는 생각이 많이 드는 책이였다.

 

다만 한 가지 명심해야할 점은, 이 책은 당장 당신의 애플리케이션 설계 능력이나 코딩 기술을 길러주는 책이 아니다. 그리고 저자의 말대로 이 책으로 객체지향을 마스터할 수 있는 것도 아니다.

이 책은 1장부터 6장까지 코드가 단 한 줄도 나오지 않으며, 애플리케이션 설계에 대해 다룬다고 했지만 아주 자그마한 간이 예제로 책임과 협력을 어떻게 설계에 적용할 수 있는지 보여주는 정도일 뿐, 너무나 조그마한 예제라서 이걸 실제 코드에 바로 대입해서 생각하기엔 어려움이 있다.

 

아쉽게도 겨우 이 정도 예제가 끝이다.

 

 

"객체지향의 사실과 오해"는 그 동안 클래스 중심으로 배워온 잘못된 관점을 바로잡고, 대체 왜 객체지향이 필요한 것인지 이해하며, 앞으로는 '조금이라도 더' 객체 지향적인 애플리케이션 설계를 위해 노력하는 태도를 기르는 것에 의의가 있는 책이다.

아, 그리고 또한 실력 좋은 개발자분들의 설계를 보며 "이렇게나 객체지향적으로 개발할 수 있구나!"라고 감탄할 수 있는 안목을 기를 수 있다. 감탄만 하고 끝나면 안되는데..😭

 

따라서 자바 코드로 작성된 예제나 실무적 관점에서의 해결책을 바라는 사람들에게는 마음에 들지 않을 수도 있으며, 실제로 구글에 검색해보면 그런 비평을 꽤나 찾을 수 있다.

 

이 책을 읽고 나처럼 감명 받을 사람은 객체지향을 "어떻게" 구현하는지 궁금했던 사람들보다는, 대체 "왜" 객체 지향을 사용하는 건지, 왜 백엔드도 아닌 프론트엔드를 가르치는 강사님들마저 "개발자라면 객체지향은 반드시 알아야죠."라고 말씀하시는지 그것 자체에 의문을 가진 사람들일 것이다.

 

쩝.. 사람마다 평가는 다르겠지만 나는 앞으로 누군가가 "객체지향이 너무 어려워요!"라고 한다면 주저하지 않고 이 책을 추천해줄 것 같다.

저자의 다음 시리즈인 "오브젝트"도 굉장히 흥미가 있기는 한데.. 지금은 다른 책도 강의도 쌓여있는 게 너무 많다..