Media Log

자바스크립트 완벽 가이드 - 전2권 - 10점
데이비드 플래너건 지음, 송인철 외 옮김/인사이트


지난달에 신청해 두었던 책들이 오늘 도서관에 도착했다.
제일 기대했던 책은 JavaScript The Definitive Guide라는 책이었는데, 워낙 유명한 책이라서 Javasciprt를 쓸 일이 거의 없긴 하지만 꼭 한번 읽어보고 싶었다.

나는 예전 부터 궁금했던 Closure에 대한 부분만을 읽어봤는데 꽤 많은 도움이 되었다.

python이나 ruby에 익숙하다면 아마도 Closure를 사용해서 프로그램을 작성하는 방법에 익숙하겠지만, C/C++, Java, C# 같은 언어를 사용한다면 대부분이 그렇지 않을 것이다.

내가 처음 Closure를 알게 된 것은 폴 그레이험의 해커와 화가라는 책에서였다.
그는 LISP가 좋은 이유를 설명하면서 누산기 함수를 여러 언어로 작성해서 비교했었는데, 그때 자바 스크립트 코드가 다음과 같았다.

function foo( n ) {
    return function( i ) {
        return n += i } }

아니 뭐 이렇게 생긴 코드가 다있어!  라고 생각했었고, 그 때부터 python이나 다른 언어에서 제공 되는 lamda 표현식에 조심씩 관심을 갖기 시작했다.

이 책에서는 10pages 정도만이 Closure를 설명하고 있는데 이해하기가 쉽지 않았다.

<html>
<head>
<script language="javascript">
var f, g;
function foo()
{
  var x = 0;
  f = function() { return ++x; };
  g = function() { return --x; };
  x = 1;
  alert(f());// "2"
}

var uniqueID1 = (function()
{
        var id = 0;
        return function() { return id++; };
})();

var uniqueID2 = (function()
{
        var id = 0;
        return function() { return id++; };
})();
</script>
</head>

<body>
        <input value = "foo" type="button" OnClick="foo();"></input>
        <input value = "+" type="button" OnClick="alert(f());"></input>
        <input value = "-" type="button" OnClick="alert(g());"></input>
        <input value = "uniqueid1" type="button" OnClick="alert(uniqueID1());"></input>
        <input value = "uniqueid2" type="button" OnClick="alert(uniqueID2());"></input>
</body>
</html>

foo 함수는 f()와 g()를 전역참조에 저장하기 때문에 f()와 g()는 같은 호출 객체를 공유한다.
따라서 상태변수 x 역시 공유된다.

uniqueID 함수는 호출될 때 마다 1씩 증가된 고유한 값을 리턴한다.
전역 변수를 하나 둔 채로 다음과 같이 작성하는 거랑 뭐가 틀리지? 하고 생각할 수도 있을 것이다.

var i = 0;
function unique()
{
    return ++i;
}

하지만 위의 전역변수는 다른 곳에서 언제든지 바뀔 수 있기 때문에 고유한 값임을 보장하지 못한다.

var uniqueID1 = (function()
{
        var id = 0;
        return function() { return id++; };
})();

반면에 위의 클로저 예제 에서는 데이터는 id라는 지역 변수안에 가지고 있고 이 변수는 다른 곳에서는 절대로 접근할 수가 없다.

uniqueID2는 새로운 호출 객체를 생성하여 그 호출 객체와 매핑된다. 따라서 uniqueID1과 uniqueID2는 서로 독립적으로 상태를 유지하는 함수 객체들이 된다.

클로저에 익숙하지 않다면 위 코드를 실행시켜보는 것이 이해하는데 도움이 될 것이다.

아래에 링크된 페이지들도 역시 유용하다.
http://en.wikipedia.org/wiki/Closure_(computer_science)
http://martinfowler.com/bliki/Closure.html
http://newlord.egloos.com/1978181    ( 위 마틴 파울러의 글을 번역 )