붕어빵틀에 관한 소고(小考)

2008년에 프로그래밍 세계에서 발을 뗀 후, 13년 만에 돌아와 자료를 정리하면서 인터넷을 검색하다 보니 붕어빵틀에 관한 비판이 아주 많이 보이네요. 아주 흥미롭게 보았고요. 일면 이해가 되는 부분도 있었습니다.

클래스 vs. 객체 = 붕어빵틀 vs. 붕어빵

저도 PHP3로 프로그래밍하던 2000년 이전에 클래스를 붕어빵틀과 같다고 비유적으로 설명드렸고요. 당시에는 디자인 패턴에 대한 대중적인 인지는 거의 없던 시절이었고요. 제가 클래스를 붕어빵틀로 비유한 것이 국내 인터넷 상에서는 거의 최초이지 않았나 싶기도 하고요. C언어에서 막 C++로 넘어가던, 객체지향언어의 초창기 시절이었습니다.

그러한 상황에서, 이해하기가 난해(?)하던 객체에 대하여 비유로 설명한 것에 대하여, 현재 시점에 와서 비판이라기 보다는 거의 비난(매도)하지 않나 싶어 씁쓸하기도 하고요.

출처를 찾아보니 2015년에 저작된 “스프링 입문을 위한 자바 객체 지향의 원리와 이해”라는 서적의 내용 중에 이 부분에 대하여 비판한 내용이 있었나 봅니다. 이 서적을 읽어 보지는 않았고요. 이 서적을 근거로 작성된 인터넷 문서들을 보고 알게 되었습니다.

아래는 붕어빵틀을 비판한 내용의 일부입니다. 여기서 메타포(metaphor)는 비유법 중에 은유법을 의미합니다.

“붕어빵과 붕어빵틀도 클래스와 객체의 이런 일면만 설명하는 메타포인데, 그걸 클래스와 객체 관계의 관계를 전부 표현하는 메타포로 착각하면서 지금까지도 그 폐해가 계속되는 것이다.”

사실을 가지고 설명해도 전체를 그대로 표현하는 것은 거의 불가능한데, 비유로 설명했으니 그 표현 정도는 사실보다는 더 못하겠지요. 비유로 설명한 것을 가지고 사실과 100% 동일하다고 받아들인다는 것도 이상하고요.

그리고 2000년 당시는 PHP3로 작업하던 시절이라, 아시겠지만 PHP3 자체가 객체지향 개념이 거의 전무하였고요. PHP를 하시는 분들은 다른 객체지향언어를 다루어 보았던 경우가 그리 많지 않았고요.

이러한 분들에게 객체에 대한 개념을 심어준다는 것이 쉬운 일은 아닙니다. 사실 당시 PHP를 하시는 분들은 객체지향 프로그래밍에 대하여 거의 관심도 없었고요. PHP는 5.3.0에 와서야 객체지향언어로서 조금씩 발들여 놓기 시작했었고요.

그렇다고 이 비유가 마치 클래스를 올바로 이해하는데 막대한 폐해를 끼친 것으로 매도(?)하는 것은 좀 심한 것 같습니다. 그 근거로 제시하는 부분이 허술하기도 하고요.

붕어빵틀 비유가 문제가 있다고 설명하면서, 아래와 같이 금형기계의 예를 들었는데, 이를 설명하면서 “‘새로운 금형기계를 하나 만들었더니 붕어빵틀이 되었다’ 라는 말이 된다. 이해가 안되는 예제다. 절대 금형기계와 붕어빵틀이 클래스와 객체 관계가 아니듯 붕어빵틀과 붕어빵도 클래스와 객체 관계가 아니다.”라고 하고 있습니다.

  1. 클래스 객체명 = new 클래스();
  2. 붕어빵틀 붕어빵 = new 붕어빵틀();
  3. 금형기계 붕어빵틀 = new 금형기계();

설명한 내용 중에 ‘새로운 금형기계를 하나 만들었더니 붕어빵틀이 되었다’는 설명은 잘못되었고요. 위 행을 제대로 설명한다면 ‘금형기계(지그 등 보조기구 포함)로 만든(new) 무엇인가가 있는데 그것은 붕어빵틀이었다. 그리고 그 붕어빵틀은 해당 금형기계에서만(금형기계 붕어빵틀) 만들 수 있다.’라고 할 수 있습니다.

1번에서 ‘new 클래스()’‘클래스를 만들었다’가 아니고 ‘클래스로 만들었다’라고 해야 합니다. 클래스는 목적이 아니라 수단입니다. ‘클래스 객체(명)’는 ‘해당 클래스로 만들어진 객체(명)’라는 뜻이고요. 결국 ‘클래스 객체(명) = new 클래스();’‘클래스로 객체(명)를 만든다.’가 됩니다. 예를 들어, ‘$hello = new SayHello();’라고 하면 ‘클래스 SayHello로 객체 $hello를 만든다.’가 됩니다.

따라서 2번에서 ‘붕어빵틀 붕어빵 = new 붕어빵틀();’은 ‘붕어빵틀로 붕어빵을 만든다.’라는 뜻이고요, 3번에서 ‘금형기계 붕어빵틀 = new 금형기계();’은 ‘금형기계로 붕어빵틀을 만든다.’라는 뜻이 됩니다.

이어서 ‘클래스는 분류에 대한 개념이지 실체가 아니다. 객체는 실체다‘라고 하던데. 예 맞습니다. 누가 아니라고 했나요. 개념이고 실체가 아니니까, 즉 이해하기가 어려우니까, 더군다나 그 당시에는 더 이해하기가 어려우니까, 독자가 당연히 알고 있는 실체(붕어빵틀)를 가지고 비유적으로, 정확히 말하자면 은유적(metaphor)으로 설명한 것이지요.

그리고 비유적 표현을 가지고, 클래스는 개념이고 객체는 실체인데 붕어빵틀과 붕어빵은 모두 실체이니 설명이 잘못되었다고 하는 것도 이상하다는 생각이 들었습니다.

이어서 추상화 개념을 설명하면서 ‘객체: 세상에 존재하는 유일무이한 사물’, ‘클래스: 분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념‘이라고 하면서, 붕어빵틀을 가지고 클래스와 같은 개념을 비유할 수 없다는 설명을 길게 하고 있었습니다.

왜 붕어빵틀을 가지고 ‘분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념’인 클래스를 비유할 수 없는 것인지 제가 이해하기 어렵네요.

“비유는 사물을 이용해 발화 의도를 전달하는 표현이라 상상력을 쉽게 자극하며 가시적이다. 비유를 사용하면 청자나 독자는 발화자의 의도를 체감하고 공감하기 쉽다.” – 나무위키 ‘비유법’ 내용 중에

붕어빵틀이라고 다 똑같은 붕어빵틀은 아닙니다. 틀에 새겨진 붕어 모양과 크기, 틀의 재질, 강도, 두께 등이 다 다릅니다. 즉, 해당 붕어빵틀 만 가지고 있는 고유의 ‘분류, 집합, 같은 속성과 기능’과 같은 성격을 그대로 가지고 있고요. 다른 붕어빵틀을 가지고는 똑같은 붕어빵을 만들 수 없습니다. 해당 붕어빵틀로 만들더라도 동일한 붕어빵은 나올 수 없습니다. 들어가는 재료(프로퍼티)와 화로의 불의 세기(불의 지피는 행위=메소드) 등에 따라 다르겠지요.

이러한 고유의 특성을 가지고 있는 붕어빵틀로 맛있는 붕어빵을 만든다는 비유를 가지고 왜 폐해를 운운하는지 모르겠습니다. 폐해가 있었다는 분들이라면 그것은 붕어빵틀과 붕어빵의 비유를 잘못 이해하신 거고요.

사실적 표현도 시대와 장소와 상황에 따라 옳지 않을 수도 있습니다. 더군다나 비유적 표현이라면 말할 것도 없고요. 그러나 붕어빵틀과 붕어빵 비유로 폐해가 있었다는 것은 좀 지나치지 않나 싶습니다. 사고가 너무 경직되지 않았으면 합니다. 더군다나 모든 사람의 관점과 경험과 경륜과 이해와 관심과 상황과 처한 위치와 다루고 있는 언어가 서로 다른 상황에서는 더욱 그렇습니다.

‘클래스는 개념이다’라는 것은 객체지향언어를 배운 분들은 다 아는 사실(비유가 아닌 사실)입니다. 그런데 실무적으로 100% 맞는 말인가요? 바인딩 시점에서 살펴보았나요? 정적 멤버에 대하여는 고려해보았나요?

‘클래스는 분류에 대한 개념이지 실체가 아니다.’

이 설명은 맞는 설명이지만 틀릴 수도 있습니다. 제가 ‘붕어빵틀은 개념이지 실체가 아니다’라고 하면 이해하실 수 있나요?

클래스와 객체의 관계를 상대적 관점에서 바라봐야지 절대적 관점에서 바라보면, 어디선가 문제가 생깁니다. 이를 클래스와 객체 사이의 상대적인 개념으로 보면 너무 나도 당연한 설명이라고 할 수 있습니다.

클래스가 객체를 바라볼 때는, 자신에 의해 생성된 인스턴스가 실체(객체라는 실체)가 될 수 있는 것이고, 객체의 관점에서 클래스를 바라볼 때는 클래스는 실체(객체라는 실체)가 될 수 없는 틀(개념)일 뿐입니다.

붕어빵틀은 붕어빵이라는 실체를 만들어내는 틀일 뿐입니다. 붕어빵의 관점에서 보면 붕어빵틀은 실체(붕어빵이라는 실체)가 될 수 없는 개념일 뿐입니다.

답글 남기기