Updated:

Tags:

Categories:

콜백 ν•¨μˆ˜λ₯Ό μ“°λŠ” 이유?

예λ₯Ό λ“€μ–΄ 1μ—μ„œ 10의 μˆ«μžλ“€μ„ 좜λ ₯ν•΄λŠ” ν•¨μˆ˜κ°€ μžˆλ‹€κ³  ν•΄λ³΄μž.

function numbers(){
  for(let i = 1; i <= 10; i++){
    console.log(i)
  }
}

numbers() // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

이 ν•¨μˆ˜λ₯Ό ν™€μˆ˜λ§Œ 좜λ ₯ν•΄μ£ΌλŠ” ν•¨μˆ˜λ‘œ μ“°κ³  μ‹Άλ‹€λ©΄ 직접 λ‚΄λΆ€μ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

function numbers(){
  for(let i = 0; i <= 10; i++){
    if(i % 2 === 1) console.log(i)
  }
}

numbers() // 1, 3, 5, 7, 9

λ§Œμ•½ 이 ν•¨μˆ˜λ₯Ό λ‹€μ‹œ 짝수만 좜λ ₯ν•΄μ£ΌλŠ” ν•¨μˆ˜λ‘œ μ“°κ³  μ‹Άλ‹€λ©΄ 또 λ‹€μ‹œ 직접 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.
κ·Έλ ‡λ‹€λ©΄ 상황에 따라 μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μ–»κ²Œν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ?

function numbers(callback){
  for(let i = 0; i <= 10; i++){
    callback(i)
  }
}

function odd(n){ // ν™€μˆ˜ μ°ΎκΈ°
  if(n % 2 === 1) console.log(n)
}

function even(n){ // 짝수 찾기
  if(n % 2 === 0) console.log(n)
}

numbers(odd) // 1, 3, 5, 7, 9
numbers(even) // 0, 2, 4, 6, 8, 10

이 처럼 ν•¨μˆ˜λ₯Ό μƒˆλ‘œ μ •μ˜ν•˜μ§€ μ•Šκ³ , κ³΅ν†΅λœ ν•¨μˆ˜λŠ” μœ μ§€ν•˜λ˜ κ²½μš°μ— 따라 λ‹€λ₯Έ κ²°κ³Όλ₯Ό μ–»κ³  싢을 λ•Œ 콜백 ν•¨μˆ˜ λ₯Ό μ“°κ²Œλœλ‹€.

콜백 ν•¨μˆ˜μ˜ ꡬ쑰

콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ λ“€μ–΄κ°€λŠ” ν•¨μˆ˜ λ₯Ό λ§ν•œλ‹€. λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²¨λ°›μ€ ν•¨μˆ˜λŠ” 일단 λ„˜κ²¨λ°›κ³ , λ•Œκ°€ 되면 λ‚˜μ€‘μ— 호좜(called back)ν•œλ‹€. νŠΉμ • κΈ°λŠ₯이 μžˆλŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜λΌκ³  μ •μ˜ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 일반 ν•¨μˆ˜λ₯Ό 콜백의 μš©λ„λ‘œ μ‚¬μš©ν•˜λŠ” 것이닀.

function plus(a, b, callback) {  // callback 은 콜백 ν•¨μˆ˜κ°€ λ“€μ–΄κ°ˆ 자리
  callback(a + b);
}

function result(number) {  // 콜백으둜 μ‚¬μš©λ  ν•¨μˆ˜
  console.log(number);
}

plus(10, 5, result); // 15

μœ„μ— μ½”λ“œμ—μ„œλŠ” plus() λΌλŠ” ν•¨μˆ˜κ°€ λ¨Όμ € 호좜이 되고, κ·Έ 후에 plus() μ•ˆμ—μ„œ result() ν•¨μˆ˜κ°€ λ‚˜μ€‘μ— 호좜이 λœλ‹€.


콜백 ν•¨μˆ˜λ₯Ό μ“°λŠ” 이유

  • μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±

function random(callback) {
    const number = Math.floor(Math.random() * 10)
    callback(number)
}


// 콜백 ν•¨μˆ˜λ“€
function λ…Έλž˜λ°©μ μˆ˜(getNumber) {
    console.log(`λ‹Ήμ‹ μ˜ μ μˆ˜λŠ” ${getNumber*10}점 μž…λ‹ˆλ‹€!`);
}

function μ˜€λŠ˜μ˜μš΄μ„Έ(getNumber) {
    if(getNumber > 5){
        console.log('μ˜€λŠ˜μ€ μš΄μ„Έκ°€ μ’‹μœΌμ‹œκ΅°μš”!');
    } else {
        console.log('였늘 ν•˜λ£¨λŠ” μ‘°μ‹¬ν•˜μ…”μ•Όκ² μŠ΅λ‹ˆλ‹€...');
    }
}

random(λ…Έλž˜λ°©μ μˆ˜)
random(μ˜€λŠ˜μ˜μš΄μ„Έ)
/*
λ‹Ήμ‹ μ˜ μ μˆ˜λŠ” 80점 μž…λ‹ˆλ‹€!
μ˜€λŠ˜μ€ μš΄μ„Έκ°€ μ’‹μœΌμ‹œκ΅°μš”!

λ‹Ήμ‹ μ˜ μ μˆ˜λŠ” 60점 μž…λ‹ˆλ‹€!
였늘 ν•˜λ£¨λŠ” μ‘°μ‹¬ν•˜μ…”μ•Όκ² μŠ΅λ‹ˆλ‹€...

λ‹Ήμ‹ μ˜ μ μˆ˜λŠ” 30점 μž…λ‹ˆλ‹€!
μ˜€λŠ˜μ€ μš΄μ„Έκ°€ μ’‹μœΌμ‹œκ΅°μš”!
*/

μ΄λ ‡κ²Œ ν•˜λ©΄ λ…Έλž˜λ°©μ μˆ˜() 와 μ˜€λŠ˜μ˜μš΄μ„Έ() 각각 ν•¨μˆ˜ μ•ˆμ— 숫자λ₯Ό μƒμ„±ν•˜λŠ” Math.floor(Math.random() * 10) κΈ°λŠ₯을 넣지 μ•Šμ•„λ„ λœλ‹€.

  • μ½”λ“œλ₯Ό μ›ν•˜λŠ” μˆœμ„œλ‘œ 순차적으둜 진행

μ•„μΉ¨, 점심, 저녁 μˆœμ„œλ₯Ό κΌ­ μ§€μΌœμ„œ 식사해야 ν•˜λŠ” μŠ€μΌ€μ€„μ„ μ§œμ•Όν•œλ‹€.
아침식사 μ½”λ“œλŠ” 1초,
점심식사 μ½”λ“œλŠ” 4초,
저녁식사 μ½”λ“œλŠ” 2초 κ°€ κ±Έλ¦°λ‹€κ³  κ°€μ •ν•œλ‹€.

function μ‹μ‚¬νŒ¨ν„΄A() {
    setTimeout(() => {
        console.log('07:00 아침식사');
    }, 1000);
    setTimeout(() => {
        console.log('13:00 점심식사');
    }, 4000);
    setTimeout(() => {
        console.log('20:00 저녁식사');
    }, 2000);
}

μ‹μ‚¬νŒ¨ν„΄A(); // κ²°κ³Ό μˆœμ„œ => '07:00 아침식사', '20:00 저녁식사', '13:00 점심식사'

//-------------

function μ‹μ‚¬νŒ¨ν„΄B() {
    setTimeout(() => {
        console.log('07:00 아침식사');
        setTimeout(() => {
            console.log('13:00 점심식사');
            setTimeout(() => {
                console.log('20:00 저녁식사');
            }, 2000);
        }, 4000);
    }, 1000);
}

μ‹μ‚¬νŒ¨ν„΄B(); // κ²°κ³Ό μˆœμ„œ => '07:00 아침식사', '13:00 점심식사', '20:00 저녁식사'

μ‹μ‚¬νŒ¨ν„΄A() 의 κ²½μš°μ—λŠ” μ½”λ“œ μžμ²΄λŠ” 순차적으둜 μž‘μ„±λ˜μ–΄ μžˆμ§€λ§Œ, μ‹€μ œλ‘œ 각 λ™μž‘λ“€μ΄ μ†Œμš”λ˜λŠ” μ‹œκ°„μ΄ λ‹¬λΌμ„œ μ™„λ£Œλ˜λŠ” μˆœμ„œμ— λ¬Έμ œκ°€ 생긴닀.
(μ•„μΉ¨ -> 저녁 -> 점심)

μ‹μ‚¬νŒ¨ν„΄B() 의 κ²½μš°μ—λŠ” 각 λ™μž‘λ“€μ΄ μ†Œμš”λ˜λŠ” μ‹œκ°„μ΄ λ‹€λ₯΄λ”라도 순차적으둜 μ§„ν–‰μ΄λœλ‹€.
(μ•„μΉ¨ -> 점심 -> 저녁)

λ‹€λ§Œ μ‹μ‚¬νŒ¨ν„΄B() 와 같이 μž‘μ„±μ„ ν•  κ²½μš°μ—λŠ” μ½”λ“œμ˜ 가독성이 떨어지고 μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μ›Œμ§€λŠ” μ½œλ°±μ§€μ˜₯μ΄λΌλŠ” ν˜„μƒμ΄ λ‚˜νƒ€λ‚˜κ²Œ λœλ‹€. 이 뢀뢄은 Javascript ES6의 Promise 와 async/await λ¬Έλ²•μ˜ 도움을 λ°›μ•„ ν•΄κ²°ν•  수 μžˆλ‹€.

참고 링크:
https://www.youtube.com/watch?v=-iZlNnTGotk

Leave a comment