콜백 함수란 ?
다른 함수의 인자로써 넘겨진 후 특정 이벤트에 의해 호출되는 함수 , 이때 함수는 포인터 / 람다식 등으로 전달되고
흔히 시스템에 의해 호출시점이 결정되는 함수라고 정의기도 했다
코드를 예로 들자면
// The callback method
function meaningOfLife() {
log("The meaning of life is: 42");
}
// A method which accepts a callback method as an argument
// takes a function reference to be executed when printANumber completes
function printANumber(int number, function callbackFunction) {
print("The number you provided is: " + number);
}
// Driver method
function event() {
printANumber(6, meaningOfLife);
}
printANumber()의 두 번째 매개변수로 function 타입의 callbackFunction을 인자로 받는다.
event()내부에서 printANumber(6, meaningOfLife); 를 하고 있는데,
meaningOfLife는 printANumber의 매개변수인 callbackFunction에 전달된다.
따라서 meaningOfLife는 위에서 밝힌 1번 정의(다른 함수의 인자로써 이용되는 함수)에 부합하여 callback 함수라고 할 수 있다.
콜백 함수를 널리 쓰이는 대표적인 예시로는 Node.js 런타임에서 구동되는 JavaScript 코드이다. Node.js의 특성상 비동기처리가 많기 때문에 처리의 결과를 프로그래머가 받기 위해서는 콜백함수를 사용하여 시스템이 결과값을 콜백함수를 호출하여 넘겨주기 때문이다. Node.js는 이게 숱하게 중첩되는 경우가 많아 콜백 지옥이라는 별명까지 붙었던 사례가 있다.
또 하나의 예시 코드로 들자면 ?
const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 512, 'sha512', (err, key) => {
if (err) throw err;
console.log(key.toString('hex')); // 'c5e478d...1469e50'
});
console.log("main ended.");
콜백은 어디까지나 비동기 구현을 위한 방법 중 하나일 뿐이고, 현대의 JavaScript에는 Promise나 async/await 등의 문법이 추가됨에 따라 콜백의 사용을 크게 줄일 수 있다. Java
Script를 포함하여 어지간한 고생산성 언어에서는 비동기 프로그램에서의 흐름 제어를 편리하게 하기 위해 비슷한 방식의 API나 문법들이 제공된다. 예를 들어 위 코드를 아래와 같이 한 번만 wrapping해 놓으면 이후에는 코드가 대각선으로 자라나는 일 없이 암호화 작업을 수행할 수 있게 될 것이다.
const crypto = require('crypto');
function pbkdf2(password, salt, iterations, len, hashType) {
return new Promise((resolve, reject) => {
crypto.pbkdf2(password, salt, iterations, len, hashType, (err, key) => {
err ? reject(err) : resolve(key.toString('hex'));
});
});
}
async function doCrypto() {
const result = await pbkdf2('secret', 'salt', 100000, 512, 'sha512');
console.log(result); // 'c5e478d...1469e50'
}
최신 JavaScript 문법을 반영한 라이브러리 패키지들은 처음부터 비동기 형태의 API가 제공되는 경우가 대부분이므로 굳이 wrapping하는 번거로움을 겪을 일도 적다.
콜백이라는것도 조금 더 공부하여 알아봐야하겠지만 Javasript 에 안에속한것이기도 하고 비동기 프로그램을 제어하는 흐름으로써 이용되기에 이해만 높인다면 도움이 될 것 같다
addEventLister ( 이벤트리스너) 정리 (0) | 2022.10.03 |
---|---|
(중요/내용추가됨)Function:함수? (1) | 2022.09.26 |
전역변수 와 지역변수 (0) | 2022.09.22 |
불리언(boolean) 뜻 과 이해 (0) | 2022.09.21 |
undefined와 null의 차이점이란 ? (0) | 2022.09.19 |