관리 메뉴

Bin's Blog

콜백 ν•¨μˆ˜ λ³Έλ¬Έ

JavaScript

콜백 ν•¨μˆ˜

hotIce 2023. 6. 21. 08:23
728x90

 πŸ§ 콜백 ν•¨μˆ˜λž€?

πŸ‘‰ μ½œλ°±ν•¨μˆ˜λŠ” λ‹€λ₯Έ μ½”λ“œμ˜ 인자둜 λ„˜κ²¨μ£ΌλŠ” ν•¨μˆ˜μ΄λ‹€. 콜백 ν•¨μˆ˜λ₯Ό λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 이 콜백 ν•¨μˆ˜λ₯Ό ν•„μš”μ— 따라 μ μ ˆν•œ μ‹œμ μ— μ‹€ν–‰ν•œλ‹€. 

πŸ‘‰ μ‰½κ²Œ 예λ₯Ό λ“€μ–΄λ³΄μž, λ‚΄κ°€ μ’‹μ•„ν•˜λŠ” 친ꡬ의 생일 νŒŒν‹°μ— μ΄ˆλŒ€λ₯Ό λ°›μ•˜λ‹€. κ·Έλž˜μ„œ λ‚˜λŠ” λΆ€λͺ¨λ‹˜ν•œν…Œ "μΉœκ΅¬κ°€ λ‚˜λ₯Ό νŒŒν‹°μ— μ΄ˆλŒ€ν–ˆμ–΄, νŒŒν‹°κ°€ λλ‚˜λ©΄ λ‚˜λ₯Ό ν•™κ΅λ‘œ 데렀닀 쀄 수 μžˆμ„κΉŒ?"라고 λΆ€νƒν–ˆλ‹€. μ—¬κΈ°μ„œ "λ‚˜λ₯Ό ν•™κ΅λ‘œ 데렀닀 쀄 수 μžˆμ„κΉŒ?"λΌλŠ” 뢀탁이 콜백 ν•¨μˆ˜μ™€ λΉ„μŠ·ν•˜λ‹€. 

이 μƒν™©μ—μ„œ λΆ€λͺ¨λ‹˜μ—κ²Œ μ½œλ°±μ„ μ „λ‹¨ν–ˆκ³ , νŒŒν‹°κ°€ λλ‚˜λŠ” μ‹œμ μ€ λͺ¨λ₯΄μ§€λ§Œ, κ·Έ μ‹œμ μ΄ 되면 λΆ€λͺ¨λ‹˜μ€ μ „λ‹¬ν•œ μš”μ²­ (λ‚˜λ₯Ό ν•™κ΅λ‘œ 데렀닀 μ£ΌλŠ” 것)을 μˆ˜ν–‰ν•˜κ²Œ λœλ‹€. 

πŸ‘‰ 콜백 ν•¨μˆ˜λŠ” μ–΄λ–€ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ±°λ‚˜ νŠΉμ • μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. 콜백 ν•¨μˆ˜λŠ” μ΄λ²€νŠΈλ‚˜ μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ” μ‹œμ μ— μ‹€ν–‰λ˜λ„λ‘ "λ‚˜μ€‘μ— ν˜ΈμΆœν•˜λΌκ³ " μ˜ˆμ•½ν•΄ λ†“λŠ” 방법을 μ œκ³΅ν•œλ‹€. 

πŸ‘‰ callback은 "ν˜ΈμΆœν•˜λ‹€"λŠ” 의미인 callκ³Ό, "λ˜λŒλ‹€"λŠ” 의미인 back의 ν•©μ„±μ–΄λ‘œ, "λ˜λŒμ•„ ν˜ΈμΆœν•΄λ‹¬λΌ"λŠ” λͺ…령이닀. 

πŸ‘‰ μ–΄λ–€ ν•¨μˆ˜ Xλ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ νŠΉμ • 쑰건일 λ•Œ ν•¨μˆ˜ Yλ₯Ό μ‹€ν–‰ν•΄μ„œ λ‚˜μ—κ²Œ μ•Œλ €λ‹¬λΌλŠ” μš”μ²­μ„ ν•¨κ»˜ 보낸닀. 이 μš”μ²­μ„ 받은 ν•¨μˆ˜ X의 μž…μž₯μ—μ„œλŠ” ν•΄λ‹Ή 쑰건이 κ°–μΆ°μ‘ŒλŠ”μ§€ 슀슀둜 νŒλ‹¨ν•˜κ³  Yλ₯Ό 직접 ν˜ΈμΆœν•œλ‹€. 이처럼 콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ μ½”λ“œ(ν•¨μˆ˜ λ˜λŠ” λ©”μ„œλ“œ)μ—κ²Œ 인자둜 λ„˜κ²¨μ€ŒμœΌλ‘œμ¨ κ·Έ μ œμ–΄κΆŒλ„ ν•¨κ»˜ μœ„μž„ν•œ ν•¨μˆ˜μ΄λ‹€. 콜백 ν•¨μˆ˜λ₯Ό μœ„μž„λ°›μ€ μ½”λ“œλŠ” 자체적인 λ‚΄λΆ€ λ‘œμ§μ— μ˜ν•΄ 이 콜백 ν•¨μˆ˜λ₯Ό μ μ ˆν•œ μ‹œμ μ— μ‹€ν–‰ν•  것이닀.

 

1️⃣ - 1️⃣ ν˜ΈμΆœμ‹œμ 

let count = 0;
let cbFunc = () => {
    console.log(count);
    if (++count > 4) clearInterval(timer);
};
let timer = setInterval(cbFunc, 300);

// -- μ‹€ν–‰ κ²°κ³Ό --
//  0 (0.3초)
//  1 (0.6초)
//  2 (0.9초)
//  3 (1.2초)
//  4 (1.5초)

πŸ‘‰ timer λ³€μˆ˜μ—λŠ” setInterval의 ID 값이 λ‹΄κΈ΄λ‹€. setInterval에 μ „λ‹¬ν•œ 첫 번째 인자인 cbFunc ν•¨μˆ˜(이 ν•¨μˆ˜κ°€ 곧 콜백 ν•¨μˆ˜μ΄λ‹€)λŠ” 0.3초 λ§ˆλ‹€ μžλ™μœΌλ‘œ μ‹€ν–‰λœλ‹€. 

πŸ‘‰ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” count 값을 좜λ ₯ν•˜κ³ , countλ₯Ό 1만큼 μ¦κ°€μ‹œν‚¨ λ‹€μŒ, κ·Έ 값이 4보닀 크면 반볡 싀행을 μ’…λ£Œν•˜λΌκ³  ν•œλ‹€. 

πŸ‘‰ μ½”λ“œ μ‹€ν–‰ 방식과 μ œμ–΄κΆŒ

code 호좜 주체 μ œμ›ŒκΆŒ
cbFunc(); μ‚¬μš©μž μ‚¬μš©μž
setInterval(cbFunc, 300); setInterval setInterval

이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ 0.3μ΄ˆμ— ν•œ λ²ˆμ”© μˆ«μžκ°€ 0λΆ€ν„° 1μ”© μ¦κ°€ν•˜λ©° 좜λ ₯λ˜λ‹€κ°€ 4κ°€ 좜λ ₯된 이후 μ’…λ£Œλœλ‹€. setInterval이라고 ν•˜λŠ” 'λ‹€λ₯Έ μ½”λ“œ'에 첫 번째 μΈμžλ‘œμ„œ cbFunc ν•¨μˆ˜λ₯Ό λ„˜κ²¨μ£Όμž μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ setInterval 이 슀슀둜의 νŒλ‹¨μ— 따라 μ μ ˆν•œ μ‹œμ μ—(0.3μ΄ˆλ§ˆλ‹€) 이 읡λͺ… ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆλ‹€. 이처럼 콜백 ν•¨μˆ˜μ˜ μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 콜백 ν•¨μˆ˜ 호좜 μ‹œμ μ— λŒ€ν•œ μ œμ–΄κΆŒμ„ 가진닀. 

 

1️⃣ - 2️⃣ 인자

πŸ‘‰ 콜백 ν•¨μˆ˜ 예제(Array.prototype.map)

let newArr = [10, 20, 30].map((currentValue, index) => {
    console.log(currentValue, index);
    return currentValue + 5;
});
console.log(newArr);

// -- μ‹€ν–‰ κ²°κ³Ό --
// 10 0
// 20 1
// 30 2
// [15, 25, 35]

πŸ‘‰ map λ©”μ„œλ“œλŠ” 첫 번째 인자둜 callback ν•¨μˆ˜λ₯Ό λ°›κ³ , μƒλž΅ κ°€λŠ₯ν•œ 두 번째 인자둜 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ this둜 인식할 λŒ€μƒμ„ νŠΉμ •ν•  수 μžˆλ‹€. thisArgλ₯Ό μƒλž΅ν•  κ²½μš°μ—λŠ” 일반적인 ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 전역객체가 λ°”μΈλ”©λœλ‹€. map λ©”μ„œλ“œλŠ” λ©”μ„œλ“œμ˜ λŒ€μƒμ΄ λ˜λŠ” λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ“€μ„ μ²˜μŒλΆ€ν„° λκΉŒμ§€ ν•˜λ‚˜μ”© κΊΌλ‚΄μ–΄ 콜백 ν•¨μˆ˜λ₯Ό 반볡 ν˜ΈμΆœν•˜κ³ , 콜백 ν•¨μˆ˜μ˜ μ‹€ν–‰ 결과듀을 λͺ¨μ•„ μƒˆλ‘œμš΄ 배열을 λ§Œλ“ λ‹€. 

 

πŸ‘‰ 콜백 ν•¨μˆ˜μ˜ 첫 번째 μΈμžμ—λŠ” λ°°μ—΄μ˜ μš”μ†Œ 쀑 ν˜„μž¬κ°’μ΄, 두 번째 μΈμžμ—λŠ” ν˜„μž¬κ°’μ˜ μΈλ±μŠ€κ°€, μ„Έ 번째 μΈμžμ—λŠ” map λ©”μ„œλ“œμ˜ λŒ€μƒμ΄ λ˜λŠ” λ°°μ—΄ μžμ²΄κ°€ λ‹΄κΈ΄λ‹€. 

 

πŸ‘‰ 첫 번째(인덱슀 0)에 λŒ€ν•œ 콜백 ν•¨μˆ˜λŠ” currentValue에 10이, indexμ—λŠ” 인덱슀 0이 λ‹΄κΈ΄ 채 μ‹€ν–‰λœλ‹€. 각 값을 좜λ ₯ν•œ λ‹€μŒ, 15 (10 + 5)λ₯Ό λ°˜ν™˜ν•œλ‹€. 그리고 두 번째(인덱슀 1)에 λŒ€ν•œ 콜백 ν•¨μˆ˜λŠ” currentValue에 20이, indexμ—λŠ” 1이 λ‹΄κΈ΄ μ±„λ‘œ μ‹€ν–‰λœλ‹€. 25 (20 + 5)λ₯Ό λ°˜ν™˜ν•œλ‹€. [10, 15, 25]μ΄λΌλŠ” μƒˆλ‘œμš΄ 배열이 λ°˜ν™˜λœλ‹€. 

 

πŸ‘‰ 인자의 μˆœμ„œλ₯Ό 바꿔도 μ»΄ν“¨ν„°λŠ” μˆœμ„œμ— μ˜ν•΄μ„œλ§Œ 각각을 κ΅¬λΆ„ν•˜κ³  μΈμ‹ν•œλ‹€. 

 

πŸ‘‰ map λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œ μ›ν•˜λŠ” 배열을 μ–»μœΌλ €λ©΄ map λ©”μ„œλ“œμ— μ •μ˜λœ κ·œμΉ™μ— 따라 ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. map λ©”μ„œλ“œμ— μ •μ˜λœ κ·œμΉ™μ—λŠ” 콜백 ν•¨μˆ˜μ˜ 인자둜 λ„˜μ–΄μ˜¬ κ°’λ“€ 및 κ·Έ μˆœμ„œλ„ 포함돼 μžˆλ‹€. 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 주체가 μ‚¬μš©μžκ°€ μ•„λ‹Œ map λ©”μ„œλ“œμ΄λ―€λ‘œ map λ©”μ„œλ“œκ°€ 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμžκ°€ μ–΄λ–€ 값듀을 μ–΄λ–€ μˆœμ„œλ‘œ λ„˜κΈΈ 것인지가 μ „μ μœΌλ‘œ map λ©”μ„œλ“œμ—κ²Œ 달렸닀. 이처럼 콜백 ν•¨μˆ˜μ˜ μ œμ–΄κΆŒμ„ λ„˜κ²¨λ°›μ€ μ½”λ“œλŠ” 콜백 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μΈμžμ— μ–΄λ–€ 값듀을 μ–΄λ–€ μˆœμ„œλ‘œ λ„˜κΈΈ 것인지에 λŒ€ν•œ μ œμ–΄κΆŒμ„ 가진닀. 

 

2️⃣ 콜백 ν•¨μˆ˜λŠ” ν•¨μˆ˜λ‹€

πŸ‘‰  λ©”μ„œλ“œλ₯Ό 콜백 ν•¨μˆ˜λ‘œ μ „λ‹¬ν•œ 경우

let obj = {
    vals: [1, 2, 3],
    logValues: (v, i) => {
       console.log(this, v, i);
    }
    
};

// { vals: [1, 2, 3], logValues: f } 1, 2}
obj.logValues(1, 2);
// window { ... } 4 0
[4, 5, 6].forEach(obj.logValues)
// window { ... } 5 1
// window { ... } 6 2

πŸ‘‰ μœ„μ— obj.logValuesλŠ” μ•žμ— 점이 λΆ™μ–΄μ„œ λ©”μ„œλ“œλ‘œμ„œ ν˜ΈμΆœν–ˆλ‹€. thisλŠ” obj을 가리킀고 인자둜 λ„˜μ–΄μ˜¨ 1, 2κ°€ 좜λ ₯λœλ‹€.

πŸ‘‰ λ°˜λ©΄μ— κ·Έ 밑에 forEach ν•¨μˆ˜μ˜ 콜백 ν•¨μˆ˜λ‘œμ„œ μ „λ‹¬ν–ˆλ‹€. objλ₯Ό this둜 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ „λ‹¬ν•œ 것이 μ•„λ‹ˆλΌ, obj.logValuesκ°€ κ°€λ¦¬ν‚€λŠ” ν•¨μˆ˜λ§Œ μ „λ‹¬ν–ˆλ‹€. objλ₯Ό this둜 ν•˜λŠ” λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ „λ‹¬ν•œ 것이 μ•„λ‹ˆλΌ, obj와 직접적인 연관이 없어진닀. forEach에 μ˜ν•΄ 콜백 ν•¨μˆ˜λ‘œμ„œ 호좜이 되고, thisλ₯Ό λ³„λ„λ‘œ μ§€μ •ν•˜μ§€ μ•Šμ•„μ„œ 전역객체λ₯Ό λ°”λΌλ³΄κ²Œ λœλ‹€

πŸ‘‰ κ²°λ‘ , μ–΄λ–€ ν•¨μˆ˜μ˜ μΈμžμ— 객체의 λ©”μ„œλ“œλ₯Ό μ „λ‹¬ν•˜λ”λΌλ„ κ²°κ΅­ λ©”μ„œλ“œκ°€ μ•„λ‹Œ ν•¨μˆ˜μΌ 뿐이닀. 

 

3️⃣ 콜백 ν•¨μˆ˜ λ‚΄λΆ€μ˜ this에 λ‹€λ₯Έ 값을 λ°”μΈλ”©ν•˜λŠ” 쒋은 방법

πŸ‘‰ bind λ©”μ„œλ“œ ν™œμš©

let obj1 = {
    name: "obj1",
    func: function () {
        console.log(this.name);
    }
};

// this.name = obj1을 좜λ ₯
setTimeout(obj1.func.bind(obj1), 1000);

// this.name = obj2λ₯Ό 좜λ ₯
let obj2 = { name: "obj2" };
setTimeout(obj1.func.bind(obj2), 1500);
728x90

'JavaScript' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

ν”„λ‘œν† νƒ€μž…  (0) 2023.07.15
콜백 지μ˜₯(κΈ°λͺ… ν•¨μˆ˜)  (0) 2023.06.27
forEach λ©”μ„œλ“œ  (0) 2023.06.02
concat λ©”μ„œλ“œ  (0) 2023.06.01
every λ©”μ„œλ“œ  (0) 2023.05.30