객체지향 프로그래밍이란 도대체 뭘까? 우리 분야에서 이만큼 정의가 갈리는 주제도 없다. 실제로 주변 동료들에게 객체지향 프로그래밍이 무엇인지 한번 물어봐 봐라. 정말 다양한 답이 나올 것이다. 그리고 그중 대부분은 우리가 흔히 알고 있는 객체지향의 오해로부터 나온다. 우리 중 더 이상 객체지향을 하지 않는 사람은 없지만, 객체지향에 대해서 제대로 알고 있는 사람은 과연 얼마나 될까?

 

그렇다면 책 <객체지향의 사실과 오해>를 읽으면 객체지향이 무엇인지 제대로 알 수 있는가? 안타깝게도 그렇지 않다. 그렇지만 적어도 객체지향에 대한 많은 오해들, 잘못된 부분들을 바로잡고, 객체지향이 무엇인지 올바르게 생각할 수 있는 토대를 마련할 수 있다. 먼저 이야기하지만, 국내 도서 중 이만한 책이 없다.

 

이 책은 정말 누구나 읽을 수 있을 정도로 쉽다. 프로그래밍을 조금만 해본 사람이라면 이해할 수 있을 정도로 예시와 비유를 정말 적절하게 활용했다. 특히나 이런 책들은 설명을 위해 비유가 너무 과해 오히려 이해가 안 가는 경우가 있는데, 이 책은 아주 효율적으로 이를 사용해 효과적으로 전달한다.

 

그렇다고 수준이 낮지도 않다. 객체지향에 대한 국내 어느 책보다도 객체지향이란 어려운 주제를 효과적으로 풀어냈다. 물론 책에 반복되는 내용이 많다는 점과 예시가 너무 단순하다는 점은 책의 아쉬운 점이다. 그래도 객체 지향이 무엇인지 스스로 생각할 수 있는 올바른 토대를 쌓기에 매우 적합하다. 어차피 객체지향은 책으로만 습득할 수 없다는 게 내 생각이다.

 

덧붙여 내 기준에 이 책은 매우 훌륭한 책이다. 국내 저서 중에도 이 정도 수준의 책이 있고 베스트셀러라는 건 다행스러운 일이다. 우리 업계에는 이런 책들이 더욱, 더더욱 많아져야 한다.

 

 

객체지향에 대한 오해

책에서 말하는 객체지향에 대한 오해는 무엇일까? 책에서 강조하는 2가지 정도에 대해 말해보려고 한다.

 

객체지향은 현실 세계에 대한 모방이다?

객체지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임이다.

아마 위 같은 정의를 당신도 한 번 정도는 들어본 적이 있을 것이다. 나도 학교에서 처음 객체 지향에 대해 배울 때 들었던 기억이 난다. 그런데 정말 객체 지향이 현실 세계에 대한 모방인가? 사실 좀만 생각해 봐도 아님을 알 수 있다. 객체는 식별자와 상태, 행동으로 이뤄져 있는데 상태까지는 그렇다 치더라도, 실세계에서 생물체 외에 대부분은 스스로 행동하지 않는 수동적인 존재이다.

 

예를 들어 ‘커피’라는 객체가 있다고 해보자. 이 객체가 어떤 행동을 하겠는가? 아마도 ‘마신다’라는 행동할 것이다. 아마 커피 객체는 ‘마신다’라는 행동을 통해 커피 상태를 변경할 것이다. 그런데 현실 세계에서 커피는 스스로 마시지 못한다. 마셔질 뿐이다. 그리고 사실 우리가 흔히 사용하는 어댑터, 레퍼지토리, 컨트롤러와 같은 개념들은 현실 세계에는 개념이 아주 흐릿한 것들이다.

 

저자는 객체 지향이 현실을 모방한 것이 아니라, 현실의 모습을 조금 참고할 뿐 궁극적인 목적은 현실과 전혀 다른 새로운 세계를 창조하는 것이라고 설명한다. 아주 괜찮은 정의다.

 

아무 의미가 없을까?

이렇게 현실 세계에 대한 모방으로 객체 지향을 설명하는게 아무 의미가 없을까? 그렇다면 왜 이러한 오해가 만연해있었을까? 이런 정의는 2가지 정도 의미가 있다

 

첫 번째는 교육적으로 이해를 돕는 데 효과적이다. 처음 접하는 사람에게 객체지향을 이런 은유 없이 설명하기는 매우 어렵다. 물론 아무리 어려워도 이 정도 수준의 교육에 머물러서는 안된다고 생각한다.

 

두 번째는 진짜 의미가 있다. 이렇게 현실 세계로 빗대는 게 우리의 인지적 부하를 줄여준다는 점이다. 말 그대로 ‘은유’ 기법을 프로그래밍에 사용하는 것이다. 이는 표현적 차이를 줄여 우리의 인지적 부하를 줄여준다는 측면에서 효과적이다.

 

객체지향은 클래스다?

두 번째 오해는 좀 더 만연하게 퍼져있는 오해다. 바로 객체지향을 클래스 지향으로 생각하는 것이다. 사실 이 문제는 얼핏보면 문제가 없어보인다. 클래스의 인스턴스가 객체 아니던가? 이러한 사고가 오해라는 것이다.

 

클래스 지향적인 사고는 객체의 개념을 제한하는 결과를 낳는다. 클래스의 인스턴스가 객체인 것은 맞으나 그것이 전부는 아니다. 클래스는 객체를 구현하는 하나의 방법일 뿐이다. 실제로 자바스크립트와 같은 언어는 프로토타입 방식으로 객체를 구현하기도 한다.

 

또한 객체는 하나의 인스턴스 단위를 넘어선 재귀적으로 더 높은 수준까지 추상화될 수 있는 존재이다. 책을 인용하면 “시스템은 사용자와 만나는 경계에서 사용자의 목표를 만족시키기 위해 사용자와의 협력에 참여하는 커다란 객체다”에서 힌트를 얻을 수 있다. 목표를 달성하기 위해 협력하며 책임을 지는 단위라면 이를 객체라고 표현할 수 있는 것이다. 이러한 관점은 객체 지향으로 시스템을 경계 짓고 관계를 맺을 때 매우 유용하다.

 

정리하면 클래스는 객체 지향에서 객체를 코드로 구현하는 하나의 방법에 불과하다. 더 중요한 건 객체의 정의가 더 넓고 실용적인 범위임을 이해하고, 이러한 객체 지향적으로 시스템을 설계하는 것이다.

 

 


 

 

어디에 내놔도 괜찮을 책

솔직하게 나는 개발 관련 책을 선별할 때 국내 책은 거의 사지 않는다. 뭐 비판의 여지가 있겠지만 부족한 예산에서 나름 함정인 책을 피하는 내 강력한 휴리스틱이다. 서점에 베스트셀러라고 올라와져 있는 국내 기술서들을 보면 한숨이 나온다. 우리 업계는 가야 할 길이 참 멀다.

 

그런 상황에서 조용호 님의 저술들은 심심한 위안이 된다. 여러 해외 바이블이라는 책도 많이 읽어봤지만, 그에 견주어도 이 책<객체지향의 사실과 오해>를 비롯해 조용호 님의 다른 저술들은 손색이 없다. 내용이 훌륭할 뿐만 아니라 쉽게 전달하기 위한 저자의 엄청난 노력이 느껴진다. 우리 업계에도 이런 책이 있다는 게 다행이고 기쁘다.

 

나는 모두에게 이 책을 추천한다. 이 책의 내용 자체도 좋아하지만, 우리 업계가 지식을 공유하는 수준도 이 책 정도의 수준까지 올라왔으면 하는 바람에서다. 국내 개발자라면 꼭 한번 읽고 내가 느낀 것처럼 많은 걸 느꼈으면 좋겠다.