감상문

객체지향의 사실과 오해

ihl 2022. 2. 9. 23:33

객체지향의 사실과 오해

  많은 사람들이 객체 지향 언어를 배우고, 자신의 프로그램을 객체 지향적으로 구성하기 위해 노력한다. 오늘날의 개발자라면 객체 지향이라는 단어를 알고 있는 것이 당연하다. 나 역시 객체지향이라는 단어를 많이 들었고, 내가 단어를 사용하기도 하였다. 그런데, 이 책을 읽고 객체지향에 대해 잘못생각하고 있는 부분들이 있다는 점을 깨닫게 되었다.


  객체 지향의 대표적 오해는 객체지향이 현실 세계의 모방이라는 것이다. 예를 들어, 이상한 나라에 앨리스와 물병이라는 두 요소가 있다. 앨리스가 물병 안의 물을 먹는 행동을 취한다면, 물병 안의 물의 양이 줄어들 것이다. 반면, 객체 지향 나라의 앨리스와 물병에서 앨리스가 같은 행동을 한다면, 앨리스가 물병에게 물의 양을 줄이라는 요청을 보내고, 물병은 자신의 판단에 의해 물의 양을 줄인다. 즉, 객체가 현실 객체의 부분적인 특징을 모방하는 것이 아니라, 현실 객체가 갖지 못한 추가적인 능력을 보유하게 된다.

 

  이러한 소프트웨어 객체의 특징을 의인화라 부르기도 하고, 현실 세계와 객체지향 세계 사이의 관계를 은유(metaphor)라고 표현하기도 한다. 현실 속 전화기를 객체 전화기로 만들었을 때, 비록 현실 전화기는 스스로 전화를 걸 수 없어도, 현실의 전화기라는 개념을 통해 소프트웨어 객체를 묘사함으로써 그 객체가 전화를 걸 수 있다는 사실을 쉽게 이해하고 기억할 수 있게 된다.

 


  객체 지향의 또 다른 오해는 '객체 지향 = 클래스 기반' 라는 점이다. 사실 객체 지향의 개념은 1960 년대 발표된 '시뮬라 67'이라는 프로그래밍 언어에서 출발했으며, 그 후 C++, JAVA와 같은 클래스 기반의 프로그래밍 언어가 유행하면서 '객체 지향 = 클래스 기반'라는 식으로 과장된 것이다. 클래스가 객체 지향 프로그래밍 언어의 관점에서 매우 중요한 구성 요소이지만, 객체 지향의 핵심을 이루는 중심 개념이라고 말할 수는 없다. 당장 JS 만 봐도 클래스라는 요소 없이 객체 지향 프로그래밍을 충분히 구현할 수 있다.

 

  훌륭한 객체지향 설계자가 되기 위해선, 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야 한다. 중요한 것은 어떤 클래스가 필요한가가 아니라, 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가 이다. 클래스는 객체들의 협력관계를 코드로 옮기는 도구에 불과하다.

 

  즉, 객체지향설계를 수행할 때, 프로그램 내에서 어떤 메시지를 주고받을 것인지를 먼저 설계해야 한다. 메시지를 주고받는 객체들이 어떻게 메시지를 처리하는지가 중요하게 여겨져서는 안 된다. 각 객체들이 메시지를 구체적으로 어떻게 처리되어야 하는지는 가 중요해져서는 안 된다. 객체가 수신한 메시지를 스스로 정한 원칙에 따라 판단하고, 의지에 기반하여 자율적으로 처리하도록 만들어야 한다. 예를 들어 커피를 만드는 프로그램이 있을 때, 커피를 만들어라라는 메시지를 받는 객체가 초보 바리스타던, 베테랑 바리스타던 상관없이 동작하게 만들어야 한다는 것이다. 이렇게 자율적인 객체들이 모여야 유연하고 단순한 협력을 만들 수 있다.


  이 책은 객체 지향에 대해 근본적인 부분부터 생각해보게해주는 책이다. 객체 지향과 객체 개념, 협력과 상태, 메시지와 메소드, 추상화 등이 왜 생겨나게 되었는지 하나씩 개념을 쌓아 나가면서 자연스럽게 객체 지향에 대한 오해를 풀고, 진짜 객체 지향이 무엇인지 알 수 있도록 유도해준다. 분량이 많은 것은 아니지만, 내용 하나하나가 이해력이 필요한 내용들이기 때문에 책을 한 번 읽었다고 바로 객체 지향이 무엇인지 통달할 수 있는 것은 아니었다. 완전히 이해하고 체화하기 위해선 몇 번 더 읽어봐야할 것 같다.