Thursday, December 21, 2006

넌더리 나는 oop 얘기들...

언젠가 pattern 에 관한 스터디를 하는 도중 누군가가 물어보았다.'꼭 클래스를 써야만 oop 인가?'라는 물음이었다.
뒤이어 나오는 자신의 질문에 대한 부연설명은 class 를 사용하지 않는 언어 특히 C같은 언어로도 객체지향은흉내낼 수 있다였다.
그렇다면 이 질문은 의도는 무엇이었을까??
class를 지원하는 언어를 사용해야 꼭 객체지향인가요??아니다.
class 를 지원하는, 아니 명백히 oop를 위한 언어임이 분명한 cpp도 c 처럼 사용하고 class는 마치 c의 라이브러리와 같은 용도로 사용하시는 분을 봤다.
설마 class를 지원 하는 언어 따위는 버리고 c로 객체지향을 구현해서 쓰고 싶다는 말은 더더욱 아닐 것이다.
지금 생각해보면 그 질문의 의도는 객체지향은 이래야 한다는 이런 저런 말들에 대한 지쳤다는 말의 다른 표현인 듯 싶었다.
class 들이 그 도마 위에 오른 것은그런 논의들이 class를 위주로, class 들간의 관계는 이래야 하며, 저래야 하며... 처럼 돌아가기 때문 인 것 같았다.
우선 그 질문에 대한 나의 대답은 no 라고 하고 싶다.
만약 그 질문의ㅡ 대답이 yes 라면 왜 굳이 oop(object oriented programming) 이라고 지었겠는가?그냥 cop(class oriented programming)이라고 지었겠지.
그 질문에는 이런 의미도 포함되어 있었던 듯 하다. '나는 object라는 것은 인정하지만, class란 건 인정못하겠습니다.'
맞는 말이다. structure 를 사용하건 class 를 사용하건 object(객체)라는 개념이 사용된다면 객체지향 이라고 볼 수 있지 않을까 한다.

내가 처음 짜본 oop 프로그래밍은 채팅서버였다. 이 채팅서버라는 세계를 채우고 있는 object는 room(채팅방), client(채팅방으로 접속하는 놈) 가 전부였다. 당장 c의 statement 나열형으로 만들어 놓은 것을 oop로 다시 설계하려니 머리 속에 떠오르는 놈은 그게 전부였다. 그렇게 만들어 놓은 놈을 선배에게 창피한 마음에 주저주저하며 보여줬다. (암것도 안 들어 있는 내 머리속을 보여주는 듯 하여...) 하지만 선배의 말은 '잘했어. 기본적으로 oop라는 개념이 들어간거잖아.' 라는 대답이었다. 하지만 지금 그 프로그래밍을 보면, capsulation 같은 건 별로 고려되지 않은 그냥 데이터와 함수의 집합에 불과해 보이는 조잡한 프로그램에 불과하다.

oop를 무엇이라고 생각하냐고 물어보면 내공이 많이 된 사람들의 입에서 나오는 얘기는 그것이다.
감추기(hiding)!!
얘가 무슨 놈을 가지고 있고 한 가지 명령을 내리면 세부적으로 어떤 동작들을 하는지를 모르게 한다는 것이다. 내가 세상을 100% 꽤뚫어 보며 살아야 생활이 가능한 것이 아니듯 oop 세계에서는 남이 무슨 일을 하건 세세한 사항까지 알아야 하는 것이 아니라는 것이다. 다만 그 일을 계승(inheritance)한 자만 그 사정을 이어 받으면 된다.
하지만 oop 라는 것을 처음 설계했을 때 부터 hiding 이 oop 의 핵심개념이다!! 라고 명확하게 인식 하고 있었을까? 처음에는 분명 내가 채팅서버를 만들 듯 사용되었을 것이라 생각된다. 어떤 객체가 있고 이것이 하는 일들이 있는 것처럼, 마치 역할 수행자들처럼 구조를 만들면 어떨까?? 하는 식으로 말이다.


그냥 단순히 statement를 나열한 것 보다 함수를 이용해서 쪼갰을 경우의 이점은 무엇인가? 중복을 막을 수 있다는 것이 첫번째라면,
어느 한 가지 일을 하는 부분을 함수로 나누어 놓는다면 우리는 그 부분을 별도로(unit) 생각할 수 있다
예를들어 strcat 같은 함수가 제공되지 않고(물론 이 함수가 구조적으로 미숙하다는 점을 배제했을 경우. 즉 이 함수가 엄청난 편리성을 제공해준다고 할경우) 매번 아래와 같은 소스를 코딩해줘야 한다고 생각해보자.
{
...
char a[100];
char b[100];
...
while(*a) *a++;
while(*a++ = *b++);
...
}
이 소스 부분을 볼 때마다 우리는 정확한 결과를 알아내기 위해 쉴새없이 머리를 굴려야 한다. 몇 분 동안의 고민뒤에 이 부분이 a 의 뒤에 b를 연결하는 것이라는 것을 알아낸다. 한 번은 몇번에 불과하지만, 이러한 코드가 여러군데 산재해 있다면, 계속해서 시간이 추가된다. (물론 여러번 읽으면 읽을 수록 익숙해지겠지만, 이건 사법고시 수험서도, 자꾸만 읽고 싶어지는 시구도 아니다. 게다가 이것은 너무나도 간단한 함수의 예가 아닌가.)

하지만 이 부분을 strcat이라는 unit으로 묶어 둠으로써 한 눈에 이 부분이 어떤 작업을 하는지 알아낸다. 이로써 우리 머리속의 논리흐름에서 하나의 작은 분기점이 없어진다. 게다가 strcat이 unit test를 잘 통과하기만 한다면, 우리는 어느정도 안심하고 strcat을 신뢰하면서 디버깅을 해나갈 수 있다.
결국 structure나 함수라는 것이 도입된 것은 인간의 논리적 본성 즉 분류하기에서 기인했다고 볼 수 있지 않을까? 그 본성이 발전하여 결국에는 oop가 된다. 분류해 놓은 작업들을 소유한 사람들이 있었으면 좋겠다. 이것 역시 분류다.

"집안에는 할 일이 많아요. 넓은 집을 청소해야 하고, 식사도 마련해야 하며, 정원도 관리해줘야 하죠. 아이들을 돌봐야 하고 자동차를 몹니다. 종종 인테리어를 바꿔주기도 하며 개를 기르기도 합니다. 이 애완동물을 키우기란 꽤나 귀찮은 작업인데 배설물을 치워줘야 하며 먹이도 주고 규칙적으로 산책도 시켜줘야 하죠. 또 가계경제는 왜 그렇게 골치 아픈지..."
이 사람은 모든 일을 자신이 알아서 했다. 필요할 때 마다 머리 속에서 자신이 해야 할 일들의 방법을 생각하며 집안일을 수행하곤 했다. 다행히 그의 머리 속은 체계적으로 잘 정리가 되어 있고, 어려운 부분들은 차분하게 메모를 해 놓는 편이라 그럭저럭 잘 해나갔다.
어느 날 이 사람이 직장에서 승진을 한다. 수입은 더 좋아졌지만, 자신이 생각해야 할 일들이 너무 많아서 집안일을 일일이 해나가기가 너무 힘들다. 그래서 고용인을 구하기로 한다. 고용인 3명(3명인 이유는 집안일이 너무 많아서 이 정도 인원이 필요하다고 생각되기 때문이다.)을 구해서 집안일을 맡긴다.
집안일은 이 사람이 자신이 하던 집안일들을 체계적으로 매뉴얼화 한 것을 고용인들에게 나누어 주고 일일이 지시하기 시작했다. 'A씨는 지금 애를 봐주세요. B씨는 개를 산책시키고, C씨는...)' 이런식으로 일을 시키고 모든 일을 다 수행했다고 보고 하면 그 때 그 때 하는 일들을 다시 정해주었다. 하는 일들은 모두 각자 가지고 있는 매뉴얼에 나와 있고, 이 사람은 지시만 하면 방법은 그들이 각자 보고 하는 식으로 진행되었다.
몇 번의 반복으로 인해 이 사람은 한가지 사실을 터득한다.
집안일을 3등분 하여 3명에게 담당을 하도록 하는 것이다.
이렇게 하면 그는 이 한마디로 지시를 내릴 수 있다. '오늘 할 일을 하도록 하세요.'
게다가 가장 중요한 것은 가끔 일어나는 불상사에 대한 책임소재를 확실히 할 수 있었다. 아이가 독감에 걸렸을 때 독감예방접종 시기임에도 불구하고 그 책임을 방관한 사람이 누구인가, 자신의 주식투자가 손해를 보고 있는데, 어떤 사람이 재무관리 쪽을 맡아서 이런 손해가 나는 투자를 했던 것일까 하는 것에 대해 책임소재가 분명해진다. 반대로, 가끔 이 사람이 무슨 일을 하는 사람인지 알 고 싶을 때는 그 사람의 명세서를 보면 된다. 흠, D씨는 청소와 음식을 맞고 있군.

그러다가 청소와 음식을 같이 하는 사람이 음식과 청소를 병행하다 보니 위생적관리에 있어서 문제점을 보인다. 그래서 지출이 더 커지겠지만, 한 사람을 더 고용하여 주방에 관련된 일만 하도록 맡긴다.

바보 같은 인물이긴 하지만, 이 인물은 바로 프로그래머다. 가장 현명해 보이는 상황이 이런 상황들을 거쳐서야 나오다니. 하지만 software developement의 역사도 이렇게 조금씩 순차적으로 발전되어 왔을거라고 본다. 단순하 일련의 기계어의 연속에서 loop, 함수, structure, class. paradime 은 점점 책임나누기로 진화해왔다. 이 진화의 이유는 단 하나.
인간이 사용하기 편하게!!
복잡해진 환경, 그러나 그 환경에 맞추어서 분화시키기에도 낮아진 상대적 비용. 두가지가 맞물려서 개발자라는 인간들이 좀 더 편리하게 그래서 좀더 가치있는 많은 것들을 하도록 발전해 간다.


oop 건, statement 형식의 프로그래밍이건...결국 컴퓨터가 보기에는 똑같다.
단순히 0과1의 나열, 아니 전기가 들어오고 안들오고의 차이 일뿐 아무것도 아니다.
결국 '왜 꼭 클래스를 써야 하나요? 저는 statement 방식이 좋습니다'하는 것은 어찌보면, '저는 기계어를 아주 잘 읽습니다. 아니 사실은 저는 트랜지스터에 전기가 들어오고 나가는 것을 느끼곤 하지요.' 라고 하는 말과 비슷하다.
물론 50억 인구중에 이런 특출난 로봇지향형 인간이 있을 수 도 있다. 하지만, 동료들은 이렇게 말하지 않을까?.
'이런이런.. 저는 기계어는 해독 불가입니다. 옆에 해석자가 따로 있어야 하지요. 어쩔 수 없어요 제가 한국에서 태어난 이상 영어가 저에게는 어렵듯이 기계어를 보고 풀이할 수는 있을 지 모르지만, 기계어 맵을 봐야 할걸요...게다가 c 정도 수준으로 까지 이해하려면...흠... 아마 저에게 그런 능력이 있어야 한다면, 저는 밥을 굶어야 할지도...'
결론은 단 한가지. 인간의 편의를 위해 만든것이라는 것. 마치 자동차나 계산기 처럼...주판도 역시나...

Wednesday, December 20, 2006

Refactoring by Folwer - Refactoring 이란...

아무것도 모른 채 읽었던 Martin Folwer 의 Refactoring 책을 다시 한 번 정리하면서 보려고 합니다.
두 번의 대 공사( refactoring) 를 겪고 나서 다시 읽는 것이니 만큼 처음과는 또 다른 느낌일것이라고 생각됩니다.
너무 좋은 책이어서 읽어보신 분들이 많으리라 생각됩니다만, 혹시라도 못보셨거나, 볼 시간이 당장은 없다는 분들께 도움이 됐음 좋겠습니다
희망사항으로는 한 번 보면 좋겠다라는 동기유발이 되었으면 좋겠다고 생각하지만, 정말 희망사항이겠지요^^;;;
혹시 이미 보신 분들 중 제가 잘못 이해하고 있다고 생각되는 부분이 있다면, 귀찮으시겠지만, 지적해주시면 감사하겠습니다.
====================================================================

Monday, December 04, 2006

우리주변의 나르시스트들, 내 안의 나르시시즘...

어느 날 Y가 나에게 물었다.
"H는 나르시스트 일까?"
열심히 치즈케이크를 먹던 나와 M은 눈을 동그랗게 뜨며, 말도 안되는 질문이라는 듯한 표정을 지어보였다.
솔직히 내가 할 말은 없었다. 자신이 나르시스트라고 인지하는 나르시스트는 없을 것이다. 나 대신 M이 대답했다.
"H는 나르시스트일리가 없어. 절대, 그녀는 나르시스트가 될 수 없지."
하지만 M이 정의내린 나르시스트란 분명 신화속의, 연못에 비친 자신의 모습을 보면서 넋이 나가 있는, 표면적 의미의 성향을 나타내는 부류가 분명했다.
나는 거울 보는 것 조차 게을리 하는 여자였으므로 그런 뜻에서 하는 말이 아니었을 것이 분명하다.
게다가 이러한 질문은 사실 나에게 하는 질문이 아니었을 것이다. 그가 손에 들고 있는 "나르시시즘의 심리학" 이라는 책은그가 한 질문은 바로 자신을 향한 것이었다는 것을 말해주고 있었다.
"그 책에 나르시스트에 대해 뭐라고 쓰여져 있었길래?"
나는 책을 고개짓으로 가리키며 물었다.
"아, 그냥...뭐..."
Y는 그냥 얼버무리려 했다. 그러니 더욱더 궁금해진다. 그 책에 어떤 내용이 쓰여 있길래? 게다가 불안해지기 까지 한다. 나는 사실 나르시스트 인걸까??조바심에 차 다시 질문을 했다.
이번엔 직접적인 내용으로.
"무언가 나를 나르시시스트라고 생각하게 만든 부분이 있을꺼 아냐?"
그러자 Y는 주저주저하며 말을 꺼낸다.
"아, 나르시시스트는 무언가, 자신이 특별하다고 생각한데, 그래서 자신의 특별함을 남에게 상처를 줌으로써 나타내려고 한다는 거지."
그 한 마디로 Y가 그렇게 생각하게 된 이유를 알 것 같았다. 나는 분명 가장 가까운 사이라는 이유만으로 그에게 나의 잘못이나결점을 감추기 위해 되려 그에게 화를 내고, 난처한 상황에서 나만 빠져나오기 위해 그 상황의 탓을 모두 y에게 돌리곤 했던 것이다.
이미 맛을 모르게 됬건만 나는그런 내 심정을 들키기 싫어서 계속해서 치즈케잌을 입안으로 구겨넣었다. 이런 것만 봐도 나는 나르시시스트임이 분명해.
"흠. 하긴 이정도의 성향이야 작은 정도차이가 있을 뿐, 누구에게나 있는 것도 같다."
자신을 위로하기 위함이었는지 아니면 나를 위로하기 위함이었는지. 이런 말을 다시 하며, 그는 그 책의 내용을 대충 요약해서 말해주었다.
"나르시시스트들은 자신이 특별하다고 생각해서 남들에게 자신에게 희생하길 강요하고 그걸 너무 당연하게 생각한데. 여기 본문 내용을 따르자면...."
그가 읽어준 본문 내용은 주위에 여러 나르시시스트들로 둘러 쌓여있는 한 여자의 이야기 였다. 그 여자는 똑같이 직장생활을 하는데도 불구하고 자신에게 맛있는 식사를 대접하고 집안을 깨끗하게 청소하길 기대하는 남편이 있고, 자신에게 좀더 신경을 써주면파출부 따위 쓰지않고도 편한 생활을 할 수 있을 거라고 믿는 엄마가 있다. 이 책의 저자는 이 주위의 인물들이 모두 나르시스트들이라고 말한다.
여기까지는...
분명나는 나의 힘든 사회생활과 지친 몸을 Y의 탓으로 돌리곤 했다. 너와 결혼만 안했다면, 네가 집안일만 좀 잘해준다면... 어쩌면 나는 나자신의 문제들을 그의 탓으로 돌림으로써, 내가 겪고 있는 문제들이 나 자신의 결점으로 인해 생긴 문제들이 아니므로 내가 해결할 수 도 없는 문제이고, 그것은 나자신의 잘못도 아니라고 내심 생각하고 싶었는지도 모르겠다.
그렇다면....
왜?
나는 왜 그런 모습들을 보였을까? 결론은 하나 나 자신을 보호하기 위해서이다. 아니 보다 정확하게는 나자신이 그 보다 우위에 있음을 보여주기 위해서. 나는 너와 같이 있지 않다면 아무 문제 없이 지낼 수 있어, 너는 지금 행복할지 모르지만 나는 너로 인해 괴롭다, 나는 이정도에서 만족할 수 있는 인간이 아니야, 나는 지금 너를 위해 희생하고 있다, 그러므로 너는 나를 위해 무언가 다른 걸 희생해야해...
이것은 역사적 나르시시즘의 전형인 귀족제도와 같다. 귀족들은 자신들이 서민들과 달리 특별한 존재로 태어났다는 것을 믿어 의심치 않았다. 그래서 서민들의 자신에 대한 희생을 당연히 여겨왔겠지. 이런, 정말 나란 인간은 역겨운 인간중에 하나 였군.
"그런데 이런 나르시시스트들이 부모가 되었을 때가 가장 큰 문제라고 하네. 나르시시스트인 부모 밑에서 자란 아이들은 제대로 된 인격형성을 겪지를 못한다라고 나와있어."
이 대목에서 나는 S를 떠올렸다. S의 엄마는 어렸을 적에 자신의 엄마로 부터 버림을 받은 존재다. 정확히는 그녀(S의 엄마)의 엄마는 너무 젊은 나이에 남편이 죽어버려서 그녀를 친가에 맡기고 자신은 재가를 해버렸다. 그랬기에 그녀는 어린시절을 온통 모성애에 대한 갈증으로 보냈다고 한다. 그런 엄마를 둔 S에게도 이러한 갈증은 마치 유전처럼 그대로 전해졌다. S의 엄마는 어린 S의 갈증은 무시한채 자신의 마음의 헛헛함을 달래려고 곱게 차려 입고 외출하는 것으로 인생을 보냈다. 결국 S 역시 엄마로 부터 버림 받은 셈이다. 그런 S는 넋두리 처럼 중얼거리곤 했다. "나도 엄마가 보고싶은데..."
한 없는 연민이 밀려들었다. 그녀를 만날 때마다 불편하게 느껴졌던 그녀의 다소 격앙되어보이던 그 감정표현들이, 어쩌면 그녀가 어쩔 수 없이 받아들여야 했던 그녀의 어린시절에서 기인한것이 아닌가 하는 생각이 들어서 였다.

About Me

Hostway Korea R&D Center