에.. 무슨 말인가 싶어서 해당 글을 읽어봤는데요.
두어달 전에 오프모임에서 잠깐 그 얘기를 한 거 같긴 한데, 열변까진 아니었던 걸로 기억하는데용.
그리고 goto를 쓰는 편이 낫다는 뜻으로 얘기한 것 같지도 않고...
그래도 얘기가 나왔으니까.. 어케든지 해명(?)을 해야겠다는 생각도 좀 드네요.
저는 그리 이론에 충실한 프로그래머는 아닙니다. 실리를 많이 따지는 편이죠.
포트란으로 처음 프로그래밍을 공부하기 시작했었는데.. (베이직도 잠깐 하긴 했지만)
그 이후에 C언어와 파스칼이 대세를 이루면서, 그 이전의 포트란이나 베이직을 비구조적이라고 했었고,
C나 파스칼을 구조적이라서 낫다..라는 논리로 급격하게 세력을 넓혔었던 기억이 납니다.
물론 포트란이나 베이직으로 구조적인 프로그래밍이 불가능하거나 힘들지도 않았는데, 단지 언어의
대세가 바뀔 때쯤 구조적인 프로그래밍이란 개념이 일반 프로그래머들 사이에서 한참 이슈를 이루고
있었단 얘깁니다. (학자들이야 그 전부터 논의를 했었겠지만.)
그 즈음에 구조적(structual)인 프로그래밍이 대세를 이루면서, goto문을 사용하는 것이 비구조적인
프로그래밍의 상징인 것처럼 마녀사냥식으로 몰아가는 분위기였었는데... 뭐, 저도 대체로는 동감을
합니다만.
그런데, 전 goto 문의 해악(?)이라는 것은, 좀 과장된 면이 있다고 생각했었습니다. (지금도요.)
왜냐하면... 프로그래밍 언어의 진화단계 면에서, while이나 for와 같은 루프문은 goto에서 발전된
것이니까요. 다시 말해, 모두들 while이나 for로 goto를 대체할 수 있는 것만큼, goto로 논리적인
루프를 만들 수도 있는 거 아니겠습니까. 뭐 이건 너무나 당연한 것이지만요.
물론 루프로 goto를 완전히 대체할 수 있는 것은 사실이지만... 대체가 가능하다는 말이 goto를
쓰는 것이 루프를 쓰는 것보다 항상 효율적이라는 뜻은 아니지요.
많은 분들이 느끼시겠지만, 지금도 간혹(하지만 무시할 수 없을 만큼은 자주) goto를 쓰는 것이
전체의 효율을 위해 훨씬 유리할 때가 있습니다. 다중 루프를 벗어나기 위한 경우는 꽤 자주 발생할
수 있고, 그 외에도 일반적이진 않지만 효율적일 때가 있죠.
당연하지만, goto문의 해악이라고 하는 것은, 사실 이 goto 자체에 어떤 원죄같은 것이 있어서가
아니라, 프로그래머의 생각없는 남용이 문제가 되었던 것이죠. 원칙 없이 goto로 소스코드의 여기
저기를 마구 점프해다니는 산만한 코드로 유지보수를 어렵게 만드는 스파게티 코딩이 문제가 되는
것이구요. 그런데 이런 스파게티 코딩의 대표적인 원인이 goto 였기 때문에, 마치 마녀사냥처럼,
절대로 써서는 안되는 것처럼 프로그래머들에게 불문율이 되어왔다고 생각합니다.
그때로부터 한참(그러니까 한 10년이 넘었네요) 지난 지금 돌아보면, goto의 해악에 대한 지적은
요 근래의 C/C++ 언어의 해악에 대한 지적과 많은 닮은 점이 있다는 생각도 듭니다.
C/C++ 언어를 공격하는 분들의 가장 큰 표적이 포인터인데.. 그런 분들의 포인터를 안쓰고도 코딩할
수 있다는 논리가, 예전의 goto를 공격하던 논리와 그다지 달라보이지 않습니다.
(뭐, 포인터는 goto보다 다루기가 어렵기 때문에 남발하기는 어렵긴 합니다만.)
전 구세대라서 그런지 아직도 레퍼런스보다는 포인터를 더 친숙하게 사용합니다.
그렇다고 남발하지는 않죠. 다른 분이 제 코드를 유지보수해야 할 경우를 생각하면 좀 조심해서
사용하는 편이기도 합니다.
하지만 분명히 포인터가 더 효율적인 경우가 반드시 있습니다.
유지보수를 위한 가독성이 중요하기도 하지만, 성능이나 코드 길이의 차이가 확연하고 그 차이가
상당히 중요할 때라면, 적어도 그 부분은 가독성이고 뭐고 아예 제쳐버리고 제 맘대로 코딩해버립니다.
이론이 현실을 모두 설명할 수는 없다는 것이 제 삶의 철학 중의 하나입니다.
그래서 마구 쏟아지는 이론들이 옳아보인다고 해서 무작정 따라가지는 않으려고 노력하고 있구요.
학문이 발전할 수록 이론은 끝없이 현실에 가까워지겠지만, 그렇다고 현실이 변하지 않고 그자리에
있는 것도 아니겠고...
또 그런 점을 간과하더라도, 프로그래밍은 과학이기도 하지만 또 한편으로는 심리적인, 혹은 개인적인
면이 강하기 때문에 이론으로 모든 효율을 다 설명해낼 수는 더욱더 불가능할 거라고 믿고 있습니다.
개인적인 면이 학문적으로 모두 해결이 곤란하니까 요즘엔 아예 개인적인 면을 무시하거나 없애야
한다는 면이 강한데.. 쩝.. 다른 분들은 어떤지 모르겠습니다만, 저 같은 경우엔 이런 개인적인
면의 매력에 이끌려서 프로그래밍을 시작했고 또 계속하고 있다는 생각이 들거든요.
그러니까.. 개인적인 코딩의 스타일(스타일이란 말로는 모두 설명이 안되지만 어쨌든)을 최대한
배제하는 것이 유지보수와 팀프로젝트에 유리하겠지만, 프로그래밍이란 작업의 매력은 그만큼
떨어질 수 밖에 없다는 생각을 하고 있답니다.
그렇다고 제가 프로그래밍을 한참 배우기 시작했던 때에 전성기를 이루었던 그런 개념들을 지금
프로그래밍을 공부하기 시작하는 분들께 권하고 싶은 생각은 없습니다. 지금은 제가 goto를 맘껏 쓰고,
또 포인터에 빠져서 거의 포인터로만 코딩을 하던 그 시절은 아니니까요.
하지만 제가 goto를 잊지 않고 가끔씩은 쓰고, 또 아직 포인터에 집착하고 있는 것은 단지 제가
아직 그런 것들에 익숙하기 때문만은 아닙니다. 그런 것들을 버림으로써 함께 잃게 되는 효율이
적지 않다는 것을 경험으로 알고 있는 이유이기도 합니다.
그럼...
김백일 님이 쓰신 글 :
: C/C++ Q/A 게시판에 보니 이런 글이 있네요.
:
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_qna&no=641
:
: "4월 오프모임때 임프님이 goto문에 대해 열변(?)을 토하셨는데..."
:
: 이 대목이 궁금하네요.
:
: 혹시 임프님 이글 보시면 그 내용에 대해서 올려주실 수 있으신지요?