Study/Node.js

[노드JS] 함수 안에서 값을 반환할 때 새로운 함수를 만들어 반환하기

AC 2019. 3. 16. 15:48



지금까지 함수를 호출했을 때 또 다른 함수를 파라미터로 전달하는 방법에 대해 포스팅한다. 

그러면 함수 안에서 값을 반환할 때 새로운 함수를 만들어 반환하는 방법도 살펴보자.


▲ 함수에서 반환하는 값이 함수 객체인 경우



어떤 함수를 실행했을 때 또 다른 함수를 반환받으면 반환받은 함수를 그대로 실행할 수 있다.


이렇게 만들면 하나의 함수를 실행했을 때 추가적인 결과를 얻거나 또는 추가 작업을 할 수 있다. 그러면 더하기 함수를 실행했을 때 그 기록을 남겨 두었다가 출력하는 기능을 가상으로 만들어보자.


ch03_test16.js 파일을 만든 후 다음과 같이 입력한다.


function add(a, b, callback) {

    var result = a + b;

    callback(result);

    

    var history = function(){

        return a + '+' + b + '=' + result;

    };

    

    return history;

    

}


var add_history = add(10, 10, function(result){

   console.log('파라미터로 저낟ㄹ된 콜백 함수 호출됨.');

    console.log('더하기 (10,10)의 결과 : %d', result);

});


console.log('결과 값으로 받은 함수 실행 결과 : ' + add_history());




여기에서는 add() 함수를 호출했을 때 콜백 함수를 호출할 뿐만 아니라, 함수 객체를 새로 만들어 반환하도록 만들었다.
반환된 함수 객체는 어떤 연산이 수행되었는지 문자열로 알려 주는 함수이다. add() 함수를 실행한 후 반환받은 함수 객체를 add_history 변수에 할당한 후 그 함수를 실행하였다.

파일을 실행하면 다음과 같은 결과가 콘솔 창에 출력된다.


▲ 반환받은 함수 실행하기


반환받은 history 객체가 함수이고 이 함수를 실행했을 때 어떤 값으로 더하기 연산을 했는지 알 수 있도록 만들었따.

이렇게 함수의 실행 결과로 함수 객체를 받을 수 있다는 것을 잘 이해했다면 반환된 함수에서 접근할 수 있는 변수에 대해서도 알아볼 필요가 있다.


반환된 함수는 보통 처음 실행한 함수 안에서 만들어 지는데, 그 안에 있는 변수들은 함수가 반환된 후에도 계속 접근할 수 있다.



▲ 반환된 함수 객체에서 함수를 만들어 준 add 함수 안의 변수에 접근하기



add 함수 안에 history 함수를 몇 번이나 실행했는지 알 수 있도록 count 변수를 만들었따면 이 변수는 add 함수에서 반환된 함수 안에서 계속 접근할 수 있다.


ch03_test17.js 파일을 만들고 코드를 입력한다.



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(10, 10, function(result){
   console.log('파라미터로 전달된 콜백 함수 호출됨.');
    console.log('더하기 (10,10)의 결과 : %d', result);
});

console.log('결과 값으로 받은 함수 실행 결과 : ' + add_history());
console.log('결과 값으로 받은 함수 실행 결과 : ' + add_history());
console.log('결과 값으로 받은 함수 실행 결과 : ' + add_history());


▲ 반환된 함수 객체에서 더하기 함수의 변수를 계속 접근한 결과



반환된 함수를 반복해서 실행하면 count 변수의 값이 증가하는 것을 볼 수 있다.

이 내용을 주의해서 보자. 반환된 history 함수가 실행될 때는 이미 add 함수가 메모리에서 접근할 수 없는 상태가 된 다음이다.

따라서 history 함수가 실행될 때는 add 함수 안에 만들어진 count 변수도 같이 접근할 수 없어야 한다.


하지만 이와 같이 함수 안에서 새로운 함수를 만들어 반환하는 경우에는 예외적으로 변수 접근을 허용한다.


이것을 클로저(Closure)라고 부른다.



LIST