OOP: revisited #1를 통해서 이야기했던 내용을 정리하면 다음과 같다.
객체지향의 핵심은 ‘추상화’
문제는 이 추상화라는 것이 자연스러운 것이긴 한데, 쉬운 것은 아니라는 점이다. 그리고, 문제가 복잡해지기 시작하면 실제 세계를 모델링해서 나온 객체 이외에 다른 종류의 객체들이 필요해진다. 인간이 실제 세계를 파악하는데 있어서 실제 사물들을 추상화한 개념concept만 사용하는 것은 아니기 때문이다. 굉장히 거칠게 말하면, 개념들을 연결하는 개념이 추가적으로 필요하기 마련이다. 집합, 접속사, 거리, 대화, 연결 등등 수많은 개념들이 실제 사물에서 파생된 개념이 아닌 개념과 개념을 연결해주는 역할을 한다. 이 개념들은 실제세계의 관계에 기반하기도 하지만, 재미있게도 사물의 기능에 기반하기도 한다. 연애소설에나 나올 법한 표현이지만, 사람사이의 관계를 ‘다리’라고 표현하는 경우가 있다. 이는 다리가 갖는 ‘연결’이라는 기능에 기반해서 의미를 포획하는 경우로 볼 수 있다.
디자인 패턴은 관계의 모방
객체지향 프로그래밍을 실제세계의 모방mimesis이란 관점에서 생각해보면, 자연스럽게 위와 같은 의미포획이 수행되리라는 사실을 짐작할 수 있다. 개념에 해당하는 객체를 만드는 것 뿐만 아니라, 그 객체들의 연결관계를 개념화하여 활용한다. 이런 류의 움직임을 가장 잘 포착할 수 있는 결과물은 ‘디자인 패턴’이다. ‘디자인 패턴’은 객체지향 소프트웨어를 작성하면서 자주 등장하는 패턴을 정리해둔 것인데, 널리 알려진 디자인 패턴들은 팩토리factory, 비지터visitor, 옵저버observer 등 실제세계에 존재하는 관계들의 ‘연결’을 모방하고 있다. 이미 디자인 패턴이란 말 자체에 객체간의 구성관계라는 의미를 내포하고 있다.
객체지향은 모방에서 출발하며, 그 모방은 범주를 가리지 않는다.
객체지향의 핵심이라고 지칭했던 ‘추상화’를 생각해보자. 추상화과정을 거쳐 프로그래머가 얻어낸 개념, 즉 클래스는 무엇일까? 실제세계의 객체를 반영하고 있는 것이겠지만, 과연 완벽한 “투사”의 결과물인가? 아니면 적당히 왜곡된 “모방”의 결과물인가? 아마, 투사의 결과물이라고 말할 수 있는 사람은 드물 것이다. 프로그래머가 작성한 클래스는 소프트웨어 시스템에서 필요한 만큼만 특징을 추출해서 만든 “모방”의 결과물이기 때문이다.
이처럼, 객체지향 프로그래밍은 거의 모든 부분에 있어서 -그 핵심인 ‘추상화’마저도- 모방을 실행한다. 그리고, 객체지향 프로그래밍 외부의 것을 모방할 뿐만 아니라, 그 내부의 것도 모방한다. 디자인 패턴을 활용하는 행위조차 디자인 패턴을 모방하여 자신의 코드를 작성하는 모방행위를 벗어나지 못한다. 이렇게 이야기하면 창의성이 없는 행위처럼 보일 수 있겠지만, 주어진 상황과 기존의 해법을 연결시키는 모방자체가 창의적인 행동이라고 보아야할 것이다. 디자인 패턴을 적용해보면 알겠지만, 종종 원래 패턴의 의미를 왜곡시켜 적용해야할 경우도 많다. 모방은 투사가 아니기 때문이다.
그리고, 이 모방들이 모여 결국은 소프트웨어란 이름의 세상을 만든다.
모방의 의미와 프로그래밍의 재미
이 글을 읽으시면서, 아마 눈치채신 분들도 있으리라 생각되지만, 핵심 개념인 모방은 미학에서 빌려온 개념이다. 그리고, 미학은 예술을 다룬다. 모방은 객체지향 프로그래밍을 가득 채우고 있다. 이 관점을 따라간다면, 객체지향 프로그래밍은 일종의 예술로 읽힐 수 있다. 실제로 그런 속성을 많이 가지고 있는 것도 사실이다. 하지만, 객체지향 프로그래밍에는 감정을 찾아볼 수 없다. 단지, 프로그래머의 이성적인 논리만 코드사이를 질주할 뿐이다. 따라서, 예술이라고 생각하는 것은 힘들지 않을까 싶다.
미학에서 빌려온 모방이 의미를 갖는 곳은 예술과 객체지향 프로그래밍의 접점이다. 이 접점은 철학과 객체지향 프로그래밍의 접점과 연결되면서, 화학적 결합을 낳는다. 객체지향 프로그래밍은 예술도 아니고 철학도 아니지만, 그 둘과 닮아있다. 이 오묘한 결합이 객체지향 프로그래밍이 재미있는 이유가 아닐까싶다.
예술가가 세상을 느끼고, 철학자가 세상을 판단한다면, 프로그래머는 세상을 만든다.
.. 이후는 패러디와 함께 다음 기회에 ..