항해

항해3주차 - Node.js (34) 콜백 함수

완두노예 2023. 1. 25. 15:31

0. 비동기와 동기를 공부하고 난 뒤에 좀 더 이해하게 된 콜백 이란?

우리가 특정 작업을 비동기적으로 처리하려면 당연하게도 컴퓨터에게 이 작업이 비동기로 처리될 것이라고 알려줘야하고, 그 작업이 처리된 이후에야 할 수 있는 작업들을 적어둬야 한다. 여기서의 콜백은 "지금 뒷방에서 작업이 끝났으니까 만약 돌릴 수 있으면 아까 거기로 돌아가서 작업 이어서 해!" 에서의 "아까 거기로 돌아가"와 같은 것.

// 아무튼 sudo code...

function setTimeout(callBackFunction, time) {
    // 실행되면 뒷방 스레드한테 가서,
    // time 만큼 째고 있다가,
    // 콜백으로 callBackFunction넘겨서,
    // 콜스택에서 실행해!
}

 

1. 콜백 함수?

야 우리가 전달한 함수를 나중에 불러줘! call back!

함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수라 하며, 함수의 외부에서

콜백함수를 전달 받은 함수를 고차함수라고 한다.

사실 함수의 인자로 함수를 전달하는 경우는 foreach, map, filter와 같은 배열의 메서드에서 경험해봤음.

// functions..

function repeat(n) {
    for(var i = 0; i < n; i++) console.log(i)
}

function repeatEven(n) {
    for(var i = 0; i < n; i++) {
        if(!(i % 2)) console.log(i);
    }    
}

function repeatOdd(n) {
    for(var i = 0; i < n; i++) {
        if(i % 2) console.log(i);
    }    
}
위의 세 함수는 각각 1부터 n까지의 모든수, 짝수, 홀수를 콘솔에 띄워주는 함수임.
즉 특정 숫자까지 반복하면서, 로직에 맞는지(홀수, 짝수, 모든수) 검증하고 맞다면 출력하고 있다.
하지만 위의 함수 각각에는 중복되는 로직이 있다. 그 부분을 분리해보면
// functions.. 

function repeat(n, callBackFunction) {
    for(var i = 0; i < n; i++) {
        callBackFunction(i)
    }
}

위와 같이 "반복"을 하는 부분과

function logAll(i) {
    console.log(i)
}

function logEven(i) {
    if(!(i % 2)) console.log(i)
}

function logOdd(i) {
    if(i % 2) console.log(i)
}

"특정 로직에 맞게 출력"하는 부분을 분리 해 낼 수 있다.

repeat(10, logEven);
repeat(20, logAll);

위처럼 공통된 하나의 로직을 분리해서 공통화 하는 행위를 '추상화' 한다고 한다.

=복잡함 속에서 필요한 관점만을 추출하는 행위를 추상화라고 한다.

물론 추상화는 더 많은 뜻을 가지고 있지만, 기본적인 맥락에서는 위와 같은 행위가 추상화라고 봐도 무방 할 것 같음.

추상화는 프로그래밍 패러다임을 이해하는데 매우 근본적인 개념이기 때문에, 나중에라도 꼭 공부하고 넘어가야 할 주제. 실제로 위와 같이 추상화를 하면, 단순하게 공통적인 부분을 줄이는 정도가 아니라, 개념들간의 계층이 생기는데 이것을 추상화 단계라고 한다. 그리고 이러한 추상화 단계는 코드를 관리하고 설계하는데 좋은 기준이 된다.

 

콜백함수의 아이디어는 위와 같은 패턴에서 시작됐다.

"제어권"같이 어려운 개념으로 설명되어 있기는 하지만, 본질은 위와 같은 콜백함수의 아이디어에서 시작한다.

함수의 호출로 해당 함수에 제어권이 넘어가고, 해당 함수가 다른 함수를 넘겨받는다면

넘겨받는 함수(콜백함수)의 실행시점을 적절하게 결정해서 실행시킨다.

 

Q. 제어권?

제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다..

 

Q. 호이스팅?

var변수와 function declaration 이런 함수 선언들이 제일 위로 올라가는 것

 

Q. 콜백 지옥

( 콜백 → 콜백 → 콜백 → … ) 이와 같은 형식으로

체인이 길어지고 함수안에 함수안에 함수 같은 모양이 나오는거다.

익명 함수로 전달하는 과정이 반복되어 코드의 들여쓰기 수준이 감당하기 어려워지는 현상.

가독성이 떨어지고 코드를 수정하기도 어렵다.

댓글수0