객체지향프로그래밍(이하 OOP)는 ‘잡힐 듯이 잡히지 않는 사랑’일까? 소프트웨어 개발자 K 씨는 지난 3년간 현장에서 자바를 이용해 프로젝트를 수행해 왔다. K는 클래스를 디자인 하고, 클래스의 객체를 생성하며, 메시지 패싱을 통해 프로그램을 수행하고, 필요에 따라 클래스를 상속 받아 새로운 클래스를 정의하기도 한다. 이제 K 씨에게 질문을 해보자. 그렇다면 도대체 OOP는 무엇이라 정의할 수 있습니까?
“음, 모든 소프트웨어는 객체로 이루어져있고…… 음……”
사실 OOP 언어를 배울 수는 있어도 OOP가 무엇인지 개념을 잡기는 힘들다. 수년 동안 객체지향 기술로 프로젝트를 수행해 온 베테랑 개발자들조차 정작 OOP가 무엇인지 물으면 확신을 갖고 이야기하지 못한다. 혹은 주섬주섬 개념을 주워 섬기지만 숙련된 개발자들 사이에서도 통일된 OOP의 정의를 발견하기란 어렵다.
OOP가 무엇이냐고 물으면 어설프게 단어를 늘어놓는 수밖에 없다. OOP는 객체, 클래스, 데이터 캡슐화, 상속, 메쏘드, 메시지 패싱, 폴리몰피즘(Polymorphism), 추상화, 정보 은닉 등등 OOP스러운 단어들이 모여서 유기적으로 하나의 패러다임을 형성했다는 정도랄까? 개개의 개념이 어떤 식으로 서로 얽혀 있는지 내가 사용하는 프로그래밍 언어는 저 개념들을 어떤 식으로 비벼서 맛있는 밥으로 만들었는지 설명하려면 그저 막막하기만 하다.
『 Communcations of the ACM 』 Feburary 2006/Vol 49, No.2에 실린 ‘The Quarks of Object-Oriented Development’(이하 CACM)는 이 문제를 정면으로 다루고 있다. 1960년대 시뮬라(Simula) 언어가 처음 OOP의 개념을 도입한 이래 어느 누구도 이것이 OOP의 전부다라고 정의하지 못했다. 각자 자신의 필요에 따라 몇 가지 개념을 정의하고, 나머지는 널리 알려져 있다고 가정해 버린 것이다.
여러 학자들과 개발자들이 ‘OOP의 핵심(essence)이 무엇이냐’라는 질문을 대답하려고 애썼지만 아직까지 어디까지가 OOP인지는 결론을 못보고 있다. 저자 암스트롱(Armstrong)은 OOP의 핵심에 대해 이야기 하려고 한다. 저자가 제목에 사용한 쿼크(quarks)라는 단어는 물리에서 더 이상 쪼갤 수 없는 가장 작은 입자의 단위를 말하는데, OOP에서 이런 쿼크가 되는 개념이 무엇인지 찾아 나섰다.
여기서 저자가 사용한 접근 방식이 흥미롭다. 암스트롱은 1966년부터 2005년까지 출간된 객체지향개발 관련 저널, 서적, 컨퍼런스 등을 망라하여 총 88개 자료에서 OOP의 개념이라고 정의한 요소들을 샘플링 해내었다. 그 결과 상속(88%), 객체(78%), 클래스(71%), 캡슐화(63%), 메쏘드(57%), 메시지 패싱(56%), 폴리몰피즘(53%), 추상화(51%) 등이 상위권을 차지했다. 하위권에는 프레임워크(1%), 재활용(3%), 커플링(2%) 등등 비교적 덜 빈번한 OOP의 개념들이 차지하고 있음을 알 수 있다.
상위 8개 OOP 개념은 비교적 광범위한 동의가 이루어졌음을 알 수 있다. 하지만 OOP 책을 몇 권만 읽어보면 각 책들이 같은 개념이라도 조금씩 다른 방법과 메타포를 사용해 설명하고 있음을 알 수 있다. 하위를 차지한 항목은 더 심각하다. 개념을 기술한 저자의 관점에 따라 OOP의 요소가 달라졌고, 저자가 개발 주기(분석, 디자인, 구현)에서 어느 시기를 강조하는지에 따라 의견을 달리했다.
다른 패러다임 언어의 개발자가 OOP를 익히는데 드는 노력은 OOP가 이해하기 어려워서만은 아닌 것이다. OOP가 제공하는 생산성 향상이란 달콤한 과일을 맛보기 위해서는 헷갈리는 개념의 홍수 속에서 살아남아야만 한다. OOP가 좀 더 광범위한 수용의 대상이 되려면 OOP의 핵심 개념을 제대로 정립하려는 노력이 선행되어야 할 것이다.