요즘은 비교적 덜 한 편이지만, 한 때 Javascript 라는 "언어" 는 언어 취급조차 받지 못하던 때가 꽤 오랫 동안 있었습니다. 특히 그런 일들을 부축인 것은 기존에 짜여진 소스코드들을 생각 없이 Copy / Paste 한 웹 개발자들의 잘못에 기인합니다. 

요즘은, 생각 없이 Javascript 코드를 짜서 먹힐 정도로 상황이 그리 녹록치가 않습니다. jQuery 와 같은 범용 클라이언트 기반 프레임워크를 사용하는 건 거의 필수로 굳어지는 분위기고, 서버 단에서도 node.js 정도는 이해하고 있어야 개발 생산성을 논할 수 있는 시대에 접어들고 있습니다.

이러한 분위기에 발맞춰, Javascript 를 한 번쯤 제대로 공부해보고 싶은 분들이 많으실 것 같다는 생각이 듭니다. 저 역시 최근 다시 한 번 공부하는 느낌으로 공부를 해 나가고 있는데, 과연 이 언어가 Google 이 그토록 어려워 할 만한 언어라는 생각이 들고 있습니다. 

upload image

Javascript 를 배울 때는 코뿔소만 따라가면 된다는 말이 있죠. 저도 지금 다시 한 번 따라가기 위해 노력중인데 처음 읽었을 땐 10% 정도 밖에 이해 하지 못했고, 세월이 어느 정도 지난 지금에와서 5판 (번역판) 을 다시 읽으니 이제야 겨우 50% 정도는 이해가 되는 것 같습니다. 참 부끄러운 일입니다.

어줍잖은 실력으로 Javascript 언어 강의를 한 적이 있었는데 기본 개념을 설명하는데 무진장 애를 먹었습니다. C/C++ 유저들에게는 특히나 난해했는데, Javascript 가 객체지향적 언어가 아니라고 생각하는 C++ 개발자분들을 설득하는 것도 어려웠고 오리 타이핑 (duck typing) 의 개념 자체를 거부하는 C 개발자분들을 이해시키는 것도 힘들었습니다. 그 나마 Java 개발자분들은 비교적 친근하게 접하는 듯 했지만 역시나, 도대체 이해 할 수 없는 몇가지 속성들 때문에 애를 먹긴 마찬가지 였습니다.

제가 생각 했을 때 Javascript 를 익히는 데 가장 큰 방해물은 아이러니하게도 오리 타이핑이 가능하다는 점입니다. 그러니까, 오리 처럼 꽥꽥 울고 오리 처럼 뒤뚱 뒤뚱 걸어가면 그 건 오리야! 라고 하는 것 처럼 어떤 객체의 속성과 행동을 보고 그 객체의 타입을 결정하는 것이 되려 배울 때는 어렵게 느껴지지 않나 생각 됩니다.

Javascript 는 매우 놀랍게도 거의 모든 것이 Object 입니다. Array 도 사실 약간의 부가 기능이 가미된 Object 이고, function 도 사실은 Object 이자 데이터 입니다. Object 객체에 [] 리터럴을 이용해서 인덱싱을 넣고, length 프로퍼티를 주게 되면 사실상 그 녀석은 Array 가 되어 버립니다. 물론 타입 검사하는 내장 메소드는 있지만 (typeof) 때때로 별 도움이 안됩니다.

upload image

오리 타이핑 뿐만 아니라 사실 Javascript 에서 제공하는 prototype 기반 상속 개념이나 closure 를 이용한 private 구현 등은 기존에 다른 주류 언어들의 패러다임을 가지고 있던 개발자들에게는 매우 어려운 문제가 됩니다. 특히 문제가 된다고 생각되는 것은 양날 검인 closure 입니다. IE 에서는 memory leak 문제를 일으키기도 하는 주범이자, private 변수 구현을 가능하도록 하는 기능이죠. (순환 참조가 일어나서 레퍼런스 카운터가 0이 안되기 때문인데, 최근엔 고쳐졌겠...죠?)

책에서 보았던 아래의 코드를 다시 보여드리겠습니다.





function ImmutableRectangle(w, h) {

    this.getWidth = function() { return w; }
    this.getHeight = function() { return h; }
}

// prototype 객체에 area 라는 public 메소드를 할당
ImmutableRectangle.prototype.area = function() {
    return this.getWidth() * this.getHeight();
}

Javascript 에서 private 이란 개념을 closure 를 이용하여 구현한 최초의 개발자로 책에서는 더글라스 크록포드(Douglas Crockford) 라는 사람이 나옵니다. URL 이 소개되어 있길래 실제로 열람해 봤는데 정말 놀라웠습니다. 대부분의 사람들이 Javascript 언어는 클래스 개념도 없고, private 와 같은 정보 은닉성 따윈 구현 할 수 없을 거라 믿었던 그 때 closure 라는 초강력 무기로 돌파구를 마련한 것입니다. (URL 은 http://crockford.com/javascript/private.html 입니다. 한글 번역본은 낭망글루님 블로그에 있습니다. http://mulriver.egloos.com/4666528 여기입니다.)

다시 위 소스코드로 돌아가보면, 함수 안에 다시 또 함수가 있는 것을 보실 수 있습니다. 안에 있는 함수는 밖에 감싸주고 있는 함수의 변수들이나 넘겨진 인자들에 대한 접근 권한이 있습니다. 이를 쉽게 얘기하면 closure 라고 할 수 있겠지요.

원래 Javascript 에서 함수 내부의 변수들은 외부로 접근이 불가능 합니다. 그런데, 함수 내부에 다시 함수를 정의하고 (위 예제에서는 Lambda 함수로 구현을 했지요~) 바깥 함수에 속한 변수들을 읽을 수는 있습니다. 심지어, 바깥 함수가 return 을 해버려도 내부 함수는 동작합니다. 유효 범위 설정 시점이 다르기 때문인데 더 자세히 알고 싶으신 분들은 코뿔소를 따라 가 보셔야 합니다. ㅎㅎ;; (코뿔소를 다 따라가신 분들은 DOM Scripting 도서도 추천 합니다. 국내에 윤석찬님이 번역하신 책이 있습니다.)

upload image

Javascript 는 여러 의미에서 프로그래밍 언어의 일반적인 궤를 벗어나 있습니다. 결론부터 이야기하면, Javascript 로 다른 언어들이 지원하는 대부분의 기능을 "흉내" 낼 수는 있습니다. 그렇지만 그건 Javascript 를 제대로 쓰는 것이 아니라는 생각이 들 때가 올 겁니다. 스크립트 언어로서의 Javascript 는, 브라우저를 벗어나게 되더라도 매우 가치있는 생산성 향상 효과를 줄 수 있습니다. 우리는 이미 node.js 와 같은 사례로 이를 직접 확인하고 있죠.

문제는 처음부터 Javascript 를 배우지 않는 한, 다른 언어의 관성이 Javascript 를 배울 때는 제대로 먹히지 않는다는 데 있습니다. 오히려 굉장한 반발력을 일으키게 됩니다. 위에서 제가 잠깐 언급했던 오리 타이핑, closure, 모든 것이 Object 라는 특징들은 그저 아주 일부에 불과합니다. Javascript 를 제대로 활용한다는 것은 그저 jQuery 같은 유명한 프레임워크를 잘 쓴다고 말 할 수 있는 게 아닙니다. 언어 그 본질에 대한 이해가 반드시 선행되어야 합니다.

그런 점에서, 코뿔소를 보면서 느끼는 거지만 아직 한 참 멀었다는 생각이 듭니다. 처음 GR Board 를 시작했을 때만 해도 저는 Javascript 를 제대로 공부해 볼 생각이 없었습니다. "언어가 아니라 그냥 도구" 라는 생각이 강했기 때문일 겁니다. 제대로 공부해보지도 않고 함부로 "쉽다" 고 이야기 했던 때를 후회합니다. 지금이라면 그런 이야긴 부끄러워서 하지 못할 텐데...

upload image

Mozilla 의 CTO 이자 Javascript 언어를 만든 브렌단 아이히는 정말 놀라운 언어를 세상에 내놓았습니다. 처음에는 그 가치가 제대로 인정 받지 못했지만, 결국 오늘날 Javascript 는 WEB 개발에 필수적인 언어가 되었고, 다시 WEB 의 중요성이 더욱 부각되면서 덩달아 그 입지가 단단해지고 있습니다. 그리고 제대로 배우고 싶어하는 사람들이 더 많아지고 있습니다.

공부 할수록 더 어렵게 느껴지지만, 그래도 그 만한 가치가 있다는 걸 알기에 짬짬히 계속 코뿔소를 따라가고 있습니다. 참, 그러고보니 저자인 데이비드 플래너건에 대해서도 궁금하신 분들이 계실 겁니다. 이분 정말 능력자이신데 오라일리 출판사에서 Ruby, jQuery, Canvas 등의 책을 집필하셨고 프로그래머들을 위한 책을 쓰고 계시는 분입니다. 블로그도 있습니다. http://davidflanagan.com 에 접속해 보시면 SIRINI`s Blog 보다 훨씬 유용한 정보들을 접하실 수 있으실 겁니다. ^^;;

언젠가 정말 Javascript 언어에 정통해지는 그 날이 오길 기대합니다. 그래서 Javascript 로만 보여줄 수 있는 놀라운 세계를 구경시켜 드리고 싶습니다. Javascript 공부하시는 모든 분들 같이 힘내보아요!