Javascript The Definitive Guide 5/E -David Flanagan
2008. 6. 15. 21:09 |
아름다운 명서(컴퓨터)
자바스크립트 완벽 가이드 - 전2권 - 데이비드 플래너건 지음, 송인철 외 옮김/인사이트 |
지난달에 신청해 두었던 책들이 오늘 도서관에 도착했다.
제일 기대했던 책은 JavaScript The Definitive Guide라는 책이었는데, 워낙 유명한 책이라서 Javasciprt를 쓸 일이 거의 없긴 하지만 꼭 한번 읽어보고 싶었다.
나는 예전 부터 궁금했던 Closure에 대한 부분만을 읽어봤는데 꽤 많은 도움이 되었다.
python이나 ruby에 익숙하다면 아마도 Closure를 사용해서 프로그램을 작성하는 방법에 익숙하겠지만, C/C++, Java, C# 같은 언어를 사용한다면 대부분이 그렇지 않을 것이다.
내가 처음 Closure를 알게 된 것은 폴 그레이험의 해커와 화가라는 책에서였다.
그는 LISP가 좋은 이유를 설명하면서 누산기 함수를 여러 언어로 작성해서 비교했었는데, 그때 자바 스크립트 코드가 다음과 같았다.
function foo( n ) {
return function( i ) {
return n += i } }
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>
<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;
}
function unique()
{
return ++i;
}
하지만 위의 전역변수는 다른 곳에서 언제든지 바뀔 수 있기 때문에 고유한 값임을 보장하지 못한다.
var uniqueID1 = (function()
{
var id = 0;
return function() { return id++; };
})();
{
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 ( 위 마틴 파울러의 글을 번역 )
'아름다운 명서(컴퓨터)' 카테고리의 다른 글
Taeyo's ASP - 김태영 (2) | 2008.07.19 |
---|---|
Art of UNIX Programming - Eric S. Raymond (1) | 2008.06.28 |
Steve McConnell의 Code Complete 2/E (2) | 2008.06.01 |
윤성우의 뇌를 자극하는 윈도우즈 시스템 프로그래밍 (0) | 2008.06.01 |
웹 진화론 -우메다 모치오 (4) | 2008.05.11 |