Search Results for 'Closure'

3 POSTS

  1. 2007.03.20 자바스크립트 다시보기 (3)
  2. 2007.02.21 자바의 클로저 지원 (2)
  3. 2007.01.30 자바스크립트(JavaScript)와 클로저 (1)

자바스크립트 다시보기

Posted 2007.03.20 02:17
어김없이 마소 마감일이 다가와서 급히 원고를 작성했습니다. 항상 "기본으로 돌아가자"를 신조로 삼는지라 이번 주제는 Ajax와 각종 위젯 제작 언어로 또 다시 각광을 받고 있는 자바스크립트를 재조명해봤습니다.

특히

1) 자바스크립트의 함수가 제1클래스이며 클로저를 지원한다는 사실
2) 자바스크립트의 독특한 오브젝트 생성 방식 및 속성 상속

에 대한 이야기를 중심으로 실었습니다. 지난 달에는 루비를 중심으로 클로저 이야기를 했었는데, 1번은 지난 달 내용이랑 약간 오버랩 되는 부분이 있네요.

내용을 공개했으면 좋으련만, 엄연히 저작권을 대가로 돈을 받는지라 흑 ㅠ.ㅠ 아래 내용은 박스 중에 하나입니다.



자바스크립트에 대한 오해의 시작

Ajax가 자바스크립트를 다시 한 번 메인 무대에 올려놓기 이전에는 대부분의 개발자가 자바스크립트는 일반적인 프로그래밍 언어에 미치지 못하는 단순한 스크립트 도구라고 생각했다. 즉, 정규 프로그래밍 언어보다는 HTML의 보조 도구 정도로 인식되는 것이 일반적이었다.

이런 오해가 생긴 이유는 네스케이프와 썬마이크로시스템즈 사가 자바스크립트를 포지셔닝한 전략에 있다. 이들은 클라이언트 프로그래밍에 있어서 자바스크립트가 자바의 경쟁자로 자리매김하길 원치 않았기 때문에, 자바에 비해 자바스크립트를 열등한 언어로 알려야만 했던 것이다. 당시 자바스크립트의 기능을 제대로 알릴 수 있었다면, 자바스크립트는 좀 더 일찍 주목받았을지도 모른다.

  1. Favicon of https://feelyou.tistory.com BlogIcon 필유

    | 2007.03.20 02:20 신고 | PERMALINK | EDIT | REPLY |

    읽고 싶어요-_ㅠ

  2. Favicon of https://skyul.tistory.com BlogIcon lambda

    | 2007.03.20 03:15 신고 | PERMALINK | EDIT |

    죄송 -_ㅠ

  3. Favicon of http://min9.net BlogIcon minq

    | 2007.05.02 13:40 | PERMALINK | EDIT | REPLY |

    imaso 에 포스팅되어있는,
    광열님의 자바스크립트 강좌(?)의 편집상태가 양호하지 않아,
    이곳에서 혹시 원본글을 찾아볼 수 있지 않을까 하는 기대로 왔는데, 아쉽네요;

Write your message and submit

자바의 클로저 지원

Posted 2007.02.21 01:40
자바 7에 추가될 자바 언어 관련 변화로는 클로저 지원이 있습니다. 클로저는 이미 함수형 언어에서는 보편적으로 쓰이고 있고, 루비에서도 코드 블록(code block)이라는 이름으로 지원되고 있는 언어 기능입니다. 이와 관련하여 클로저 명세를 주도하고 있는 Neal Grafter가 발표한 <Advanced Topics In Programming Languages: Closures For Java>를 구글 비디오를 통해 보았습니다.

Grafter의 강연에 따르면 자바의 클로저 지원도 자바 제네릭스와 마찬가지로 컴파일 타임에 모두 이루어지며, 내부적으로 익명 내부 클래스(anonymous inner class)를 사용하고 있습니다. 다만 익명 내부 클래스는 예외 처리, final 외에 지역 변수를 받는 방법, return 문 지원 등과 관련하여 제약 사항이 있는데, 이를 클로저에서 해결하는데 복잡한 이슈가 있다고 하네요.

위 강연 비디오는 1시간 50분 정도로 꽤 길긴 한데, 자바 클로저의 요구사항과 해결 방법을 아주 명쾌하게 설명하고 있어서 좋더군요. 더불어 클로저를 지원했을 때 JDK API가 어떻게 변화하게 될지에 대해서도 이야기하고 있습니다. 좀 더 관심 있으신 분은 현재 논의 중인 자바 클로저 명세서(Closures for the Java Programming Language)도 참고하시기 바랍니다.

강연을 보면서 받은 느낌은 JDK를 통해 구현된 API(예를 들어 Collection 클래스에 map이나 reduce 함수 등을 추가)를 사용하는 것은 간단하지만, 직접 클로저를 사용하는 메서드를 구현하기는 상당히 까다로울 것으로 보입니다. 이 부분은 JVM을 고치지 않고 어떻게든 컴파일러로 모두 처리하려고 노력한 제네릭스랑 상당히 유사한 면이 있습니다. 또한 lexical scoping하는 요소가 변수 밖에 없는 Scheme과 같은 언어와 달리 생각해야 할 요소가 많아서 사용자 입장에서는 별로 직관적이지 않은 구현이 될 수 밖에 없는 부분이 있고요.



뱀다리

블로그의 제목을 "소프트웨어 이야기"에서 "프로그래밍 언어 이야기"로 변경하였습니다. 앞으로는 주 관심 분야인 프로그래밍 언어 쪽에 좀 더 관심을 집중하고 자세히 다루려고 합니다.


  1. Favicon of http://jsjang.tistory.com BlogIcon 장진성

    | 2007.02.21 16:44 | PERMALINK | EDIT | REPLY |

    자바가 갈수록 커지는 것 같은 느낌이... 예전에 1.1에 비해서 용량이나 기능이 갈수록 커져서 너무 무거워져 가는게 아닌지. 기능은 갈수록 좋아지지만 너무 무거워지는 것은 좀 문제가 되지 않으려나. 오픈소스로 개방되면 버젼이 여러가지로 나뉠지도... ^^

  2. Favicon of http://www.hybrid.pe.kr/tt BlogIcon Hybrid

    | 2007.02.21 21:08 | PERMALINK | EDIT | REPLY |

    Lisp 을 공부하는 이유중에 하나가 Closure 인데.. Java에서도 지원이라... Java 공부를 다시 시작해야겠군요.
    좋은 정보 감사합니다~

Write your message and submit
자바 스크립트는 함수형 언어들과 마찬가지로 클로저(closure)를 지원한다.

function sayHello(name) {
  var text = 'Hello ' + name; // local variable
  var sayAlert = function() { alert(text); }
  return sayAlert;
}

위 함수 sayHello()의 리턴 값은 또 다른 함수인 function() { alert(text); }이다. 이렇게 얻은 함수는 다음과 같이 호출할 수도 있다.

var fun = sayHello('Jane')
fun();


함수 안에 함수를 정의하는 중첩 함수(nested function)의 개념은 어렵지 않지만, 클로저는 중첩 함수에 대한 단순 함수 포인터만은 아니다. sayHello() 함수에서 text는 지역 변수이므로 스택에 할당하는 구조를 따른다면 sayHello() 함수가 리턴된 후에는 더 이상 text 변수의 값을 읽을 수 없어야 한다. 자바스크립트에서 function() { alert(text); } 같이 클로저를 선언하면 클로저 내부에서 참조하는 지역 변수인 text를 마치 힙에 할당한 것처럼 보존한다. (즉 클로저에 대한 감춰진 포인터가 하나 더 있는 셈이다.) 따라서 sayHello() 함수가 리턴된 후에도 클로저를 호출했을 때 text 변수의 값을 읽을 수 있는 것이다.

자세한 내용은 참고 문서를 참조하기 바란다.


참고 문서
[1] JavaScript Closures 101- they're not magic
http://www.javascriptkit.com/javatutors/closures.shtml

[2] More closure examples
http://www.javascriptkit.com/javatutors/closures2.shtml

  1. Favicon of http://blog.naver.com/minis24 BlogIcon minis24

    | 2009.11.09 14:32 | PERMALINK | EDIT | REPLY |

    클로저는 가비지컬렉션(gc)의 작동방식을 이용한 방법인데요..자바스크립트 클래스에서 프라이빗 변수를 선언할때 사용하면 유용합니다.

    맨처음 발견한 개발자도 프라이빗 변수를 만들때 사용했죠~

    자바스크립트에서 gc는 아무런 참조가 없는 객체를 메모리에서 삭제하지요...하지만 클로저를 사용하여 참조를 리턴하게 되면 함수가 실행이 끝난뒤에도 참조가 살아 있기 때문에 객체가 메모리에서 삭제되지 않고 사용할 수 있게 되는것입니다..

Write your message and submit