C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[215] 클로저(Clouser) 를 아시나요 ...
둘리.CSIEDA [dooly386] 22930 읽음    2010-08-09 10:34
프로그래밍 언어를 배우다보면 closure (우리말로 클로저 로 표현?) 라는 것을 들어본 적이 있을 것입니다.

그러나 ,c/c++, java, C# 등을 주로 하는 프로그래머들은 이에 대하여 이해를 잘 못하는 사람들이 있으며, 원칙적으로 c/c++ 등이  closure 를 지원하지 않습니다.

어떤 언어가 closure 언어인지 아닌지.. 이렇게 분류해보면, c/c++,java,C# 등은 closure 언어가 아닙니다.

boost 라이브러리를 사용하면 closure 를 구현할 수 있습니다만, 어쨌든, closure 를 지원하는 언어는 smalltalk, ruby ,lisp 등에서 사용됩니다. closure 는 block 이라는 개념으로 사용하기도 합니다.



(*참고: c/c++, c# 등에서도 closure와 유사한 것을 사용할 수 있습니다. c# 의 경우 delegate 가 그것이지요)



Clouser 의 개념에 대하여 이미 아시는 분은 이글을 읽으실 필요는 없을 듯 합니다..



기본적으로 클로저란 함수 호출시 인자로 전달될수 있는 코드 블럭을 말합니다.

코드 블럭이 자신이 정의될 때의 주변 환경(코드 블럭이 정의될때의 로컬 변수들의 값)을 기억하여 나중에 수행될 때도 원래의 환경을 유지하며 수행된다는 것을 말합니다.



개념적으로 다음을 생각해 보죠.



a = 10

b = 20



a 와 b를 사용하는 closure 블럭 생성

   이를 f 라고 간단히 칭하고, f 는 a + b 의 값을 계산해 준다고 생각해보죠.



a = 30

b = 10   이라고 변경을 가합니다.



생성된 closure f 를 호출하면 답이 얼마가 나올까요??



답은 a = 10 + b = 20  ==> 30 입니다. 해당 클로저 블럭이 생성될때 해당 클로저는 생성될때의 상태를 보관하고 있습니다.

그 환경이 변경된다고 해도 원래 만들어진 상태에서의 주변 상태를 유지 한다는 것이죠.



이런 개념이 클로저의 가장 기본적인 생각 입니다.



c 에서도 boost 를 사용하여 이러한 개념을 구현할 수 있습니다. (언어가 지원하는 것이 아니라, boost 라이브러리의 function 이라는 것이 지원하는 것이니 오해 없으시길 바랍니다, 사실 function 이라는 template 이 해주는 것이죠)



#include <boost/function.hpp>
using namespace boost;



    function<void (int)> funcAB()
    {
        int a = 7, b = 3;
        function<void (int)> f = ( cout << a * _1 + b << endl);
        return f;
    }

    int main()
    {
        function<void (int)> f = funcAB();      


        f(5);

        return 0;
    }







위의 예에서 , funcAB() 함수는  y = a*x + b 정도의 1차식 함수를 계산해서 출력해주는 함수 블럭을 return 해주는 함수 입니다. 함수를 만들어 하나의 block 으로 만들어 return 해준다고 보시면 됩니다.

여기서 return 된 함수는 결국 a 와 b 를 해당 함수가 만들어 질 때의 환경 그대로 보전되어 집니다. 즉 a,b 변수의 값이 scope 밖에서도 그대로 유지 되는 것이죠.



이러한 closure 의 특징은 하나의 환경하에서 여러개의 코드블록을 정의하여 이후에 실행시킬 수 있는 multiple function의 사용을 가능하게 합니다.


-----------------------------------------------------
원문은 http://cafe.naver.com/luamadang/66
-----------------------------------------------------
박지훈.임프 [cbuilder]   2010-08-09 11:57 X
참고로...
델파이에서는 클로저를 델파이 2009 버전부터 언어 차원에서 공식 지원하고 있습니다.
Anonymous method라고 하죠.
김호광 [testcode]   2010-08-22 18:27 X
delphi 클로저인 Anonymous method는 느립니다... 물론 빌더 부스트보다는 빠릅니다.

+ -

관련 글 리스트
215 클로저(Clouser) 를 아시나요 ... 둘리.CSIEDA 22930 2010-08-09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.