[Node.js] 콜백 함수

콜백 함수 사용하기

함수를 파라미터로 전달하는 경우는 대부분 비동기 프로그래밍(Non-Blocking Programming) 방식으로 코드를 만들 때이다. 예를 들어, 더하기 함수를 실행한 후 결과 값이 반환될 때까지 기다리지 않고 그다음 코드를 실행하려면 비동기 방식으로 코드를 만들어야 한다. 즉, 더하기 함수를 실행하는데 시간이 걸리기 때문에 그다음 코드를 바로 실행하고 연산이 끝났을 때 파라미터로 전달한 함수가 실행될 수 있다면 그 시점에 결과를 처리할 수 있으므로 효율적인 프로그램을 만들 수 있다.

이 때 파라미터로 전달되는 함수를 콜백 함수(Callback function)라고 한다. 콜백 함수는 함수가 실행되는 중간에 호출되어 상태 정보를 전달하거나 결과 값을 처리하는 데 사용된다.

이제 콜백 함수를 사용해보자.

function add(a, b, callback){
    var result = a + b;
    callback(result);
}
 
add(1010function(result){
    console.log('결과: %d', result);
});
cs

결과는 20이 출력될 것이다. function 작성에서 return ~ 을 사용하지 않고 callback(변수명)을 사용한다. 더하기 연산을 한 결과 값은 파라미터로 전달된 콜백 함수를 호출하면서 그 콜백 함수로 전달한다. 콜백 함수는 미리 변수에 할당해 두었다가 add() 함수를 호출할 때 파라미터로 전달할 수도 있지만, add() 함수를 호출할 때 익명 함수로 만들어 파라미터로 바로 전달할 수도 있다.

함수의 값을 반환할 때 새로운 함수를 만들어 반환하기

어떤 함수를 실행했을 때 또 다른 함수를 반환받으면 반환받은 함수를 그대로 실행할 수 있다. 이렇게 만들면 하나의 함수를 실행했을 때 추가적인 결과를 얻거나 추가 작업을 할 수 있다.

function add(a, b, callback){
    var result = a + b;
    callback(result);
    
    var history = function(){
        return a + '+' + b + '=' + result;
    };
    return history;
}
 
var add_history = add(1010function(result){
    console.log('파라미터 콜백 함수 호출됨');
    console.log('더하기 결과: %d', result)
});
 
console.log('결과 값으로 받은 함수 실행결과: ' + add_history());
cs

여기서는 add() 함수를 호출했을 때 콜백 함수를 호출할 뿐만 아니라 함수 객체를 새로 만들어 반환한다. 반환된 함수 객체는 어떤 연산이 수행되었는지 문자열로 알려준다.

클로저

이렇게 함수의 실행 결과로 함수 객체를 받을 수 있다는 것을 잘 이해했다면 반환된 함수에서 접근할 수 있는 변수에 대해서도 알아볼 필요가 있다. 반환된 함수는 보통 처음 실행한 함수 안에서 만들어지는데 그 안의 변수들은 함수가 반환된 후에도 계속 접근 가능하다.

function add(a, b, callback){
    var result = a + b;
    callback(result);
    
    var count = 0;
    var history = function(){
        count++;
        return count + ' : ' + a + '+' + b + '=' + result;
    };
    return history;
}
 
var add_history = add(1010function(result){
    console.log('파라미터 콜백 함수 호출됨');
    console.log('더하기 결과: %d', result)
});
 
console.log('결과 값으로 받은 함수 실행결과: ' + add_history());
console.log('결과 값으로 받은 함수 실행결과: ' + add_history());
console.log('결과 값으로 받은 함수 실행결과: ' + add_history());
cs

count 변수는 add() 함수 안에서 만들어진 것이지만 add() 함수에서 반환된 함수 객체에서는 계속 접근할 수 있다. 실행하면 count 변수의 값이 증가하는 것을 볼 수 있다.

반환된 history 함수가 실행될 때는 이미 add 함수가 메모리에서 접근할 수 없는 상태가 된 다음이다. 따라서 history 함수가 실행되면 이미 add 함수는 메모리에서 접근할 수 없다. 하지만 이와 같이 함수 안에서 새로운 함수를 만들어 반환하는 경우에는 예외적으로 접근을 허용하는데, 이를 클로저(Closure)라고 부른다.

댓글 없음:

Powered by Blogger.