Callback / Clojure / Continuation

배경

콜백과 클로저는 JavaScript를 배우거나 OpenGL에서 본 개념이다.
계속은 The Little Schemer에서 본 개념인데 너무 헷갈려서 정리해 놓는다.

계속 때문에 머리가 터질 것 같다

참조

포인트

  • 콜백

    • 함수에 인자로 넘겨지는 함수
    • 함수에 인자로 넘겨지므로써 그 함수에 따른 기능을 하도록 한다.
    • ex) Nodejs에서 req res에서의 콜백, OpenGL에서의 keyfuc콜백
  • 클로저

    • 클로저는 함수가 선언될 당시의 환경을 기억했다가 나중에 호출되었을때 원래의 환경에 따라 수행되는 함수이다.
  • 계속

    • actor(lamda function)가 값과 처리방식을 다음 actor에 넘겨준다.
    • 다음 actor은 값을 다른 actor에 넘겨주거나 처리하거나 할 수 있다.

콜백

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//메인 프로그램
function MainProgram {
var arg;
LibFunc(arg, CallbackFunc);
}
//콜백 함수
function CallbackFunc(result) {
//result 이용
}
//라이브러리 함수
function LibFunc(arg, callback) {
var data; // 작업수행
callback(data);
}

클로저

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
function outer() {
var x=0;
return function() { return ++x; }
}
var x=-1;
var f= outer();
console.log(x); // -1
console.log(f()); //1
console.log(f()); //2
console.log(f()); //3

예시2 : 초기화

1
2
3
4
5
6
7
8
9
10
11
12
13
function outer() {
var x=0;
return function(){ return ++x; }
}
var x=-1;
outer(); //function(){ return ++x; }
console.log(x); // -1
console.log(outer()()); //1
console.log(outer()()); //1
console.log(outer()()); //1

예시3 : 클로저 인스턴스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function outer() {
var x=0;
return function() { return ++x; }
}
var x=-1;
var f= outer(); //인스턴스 하나를 선언하는 효과다!!
var g= outer(); //이렇게 하면 별도의 인스턴스로 생성된다.
console.log(x); // -1
console.log(f()); //1
console.log(f()); //2
console.log(f()); //3
console.log(g()); //1 //새롭게 1부터 시작하는 것을 볼 수 있다.
console.log(g()); //2
console.log(g()); //3

클로저는 비공개 내부 변수를 갖는 함수 인스턴스 생성자이다.

클로저로 생성한 독립된 변수 공간을 가진 인스턴스를 클로저 인스턴스라고 한다.

Q) 근데 결국 클로저를 어따가 쓰는거지?

계속

1
2
3
4
5
(define fact (lambda n c)
(if (= n c 1 )
(fact (- n 1)
(lambda (a) (c (* n a)))))))
Share