콜백 함수 클로저 함수란?

안희수·2021년 2월 10일
0

JavaScript를 흔히 함수형 언어라고 말하는데
그 대표적인 두가지를 예로 들어본다면
Callback 함수와 Closure 함수라고 생각한다.

콜백이라고 하는 경우는 과거 C# 으로 응용프로그램을 만들때
비동기적으로 함수를 호출해야 하는 케이스가 있었다.
본문과 관계는 없지만 그 와 관련된 이야기를 하자면
그 전에 만들었던 프로그램은 쓰레드 타이머를 통해
주기적으로 값을 갱신하는 기능이 필요로 했었고
Invoke로 대리자를 호출하여 메소드를 실행하였는데

이 때 대리자(Delegate)가
특정 함수를 비동기적으로 호출하는 콜백 기능을 사용하였다.
동기적으로 할 경우 C#에 경우는 CrossThread라고 하여
쓰레드와 함께 프로그램이 죽어버리는 현상이 발생하였는데
그 때문에 콜백이라고 하는 개념을 아직 기억하고 있다.

javaScript에서도 콜백함수라고 하는 것이 존재하는데
javaScript에서 함수는 객체이기 때문에
함수에서 함수를 호출할 수 있다.
중요한 것은 여타 언어에서도 함수 내에서 함수를 호출할 수 있지만
JavaScript는 함수를 리턴 값으로도 호출할 수 있다는 것이다.

// 함수(내부 함수의 값을 리턴하는 함수)
function doSomething(func,a,b){
return func; // 함수를 리턴한다
}
// 콜백 함수1 (a 와 b)를 더하는 함수
function plus(a,b){
return a + b; // a + b 의 값을 호출한다.
}
// 콜백 함수2 (a 와 b)를 빼는 함수
function minus(a,b){
return a - b; // a - b 의 값을 호출한다.
}

인자 a 와 b
var a = 1;
var b = 2;

console.log(${a} + ${b} = ${doSomething(plus(a,b))});
console.log(${a} - ${b} = ${doSomething(minus(a,b))});

실행 결과

함수에서 함수의 기능을 실행하는 것 자체라고만 한다면 문제는 아니지만
그 전에는 예를 들어

// C# 코딩
int a = 1;
int b = 2;

private int plus(int a, int b){
return a + b;
}
private int minus(int a, int b){
return a - b;
}

private void dosometing(string command,int a, int b){
if(command == "plus"){
plus(a,b);
}
else if (command == "minus"){
minus(a,b);
}
}

console.writline(dosometing("plus",a,b));
console.writline(dosometing("minus",a,b));

이렇게 처리해야 했는데 저 "plus" 혹은 "minus" 에 해당하는 부분에
값을 줄 수 있을 지언정 함수를 줄 수 없었기 때문이다
(Class나 구조체 정도는 가능했었다.)

그러나 JavaScript 에서는 저기에 함수를 인자로 보내서
함수를 값의 형태로 받아올 수 있다는 점에서
전에 알던 형태와는 분명하게 다른 것을 느낄 수 있었다.

클로저 함수라고 하는 것은
함수 내 함수 호출이라 볼 수 있는데
이 역시 다른 언어에서 본다면
함수에서 함수를 호출할때 외부에 다른 함수를 호출할 수는 있어도
함수 내부에서 함수를 정의하여 호출할 수 없다.

// 클로저 함수 예시
function factory_Movie(title){
return {
get_title : function(){
return title;
},
set_title: function(_title){
title = _title;
}
}
}
let ghost = factory_Movie('Ghost in the shell');

여기서 함수의 라이프사이클을 설명하지는 않았지만
JavaScript에서 함수는 return 이 발생한 시점에서
함수의 수명이 끝나는데

이때 함수가 선언되는 시점에 다른 변수에 함수를 선언하면
함수는 사라졌지만 함수가 선언될 당시의 값은
해당 변수에 그대로 남아있고
함수 내 내부변수 역시 그대로 남아있어

그 값을 다시 불러올 수도 있다.
중요한 것은 이 클로저 함수의 사용 목적은
단순히 변수로 값이 지정되어 있을 경우 변수의 값은 바뀔 수 있지만
함수내 내부 함수로 정의하게 되면

클로저 함수로 정의한 변수의 값의 접근을 제어하여
값이 뒤바뀌거나 하는 것을 막을 수 있다는 것이다.

저 ghost 라고 하는 변수의 경우
직접적으로 title에 접근할 수는 없고
get_title(); 을 통해서만 접근할 수 있으며
title의 값을 바꿀 때는 set_title(title); 을 통해서만
값을 바꿀 수 있다.

만약 상수(const)로 변수의 값을 만들 경우
이 경우도 값을 바꿀 수는 없지만 실제로 바꿔야 하는 상황에서는
값을 바꿀 수 없기 때문에 저런 식으로 외부의 접근을 막으면서
값을 변경하는 방식으로 클로저 함수를 사용하는 것으로 소개하고 있다.

profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

0개의 댓글

관련 채용 정보