JavaScript/함수 완전 정복

JavaScript 콜백 함수 개념 이해 - 간단 가이드

코딩하는 패션이과생 2025. 6. 24. 22:12
반응형

콜백 함수란?

콜백 함수(Callback Function)는 다른 함수의 매개변수로 전달되어, 특정 시점에 호출되는 함수입니다. "나중에 다시 호출(call back)한다"는 의미에서 콜백이라고 부릅니다.

🔍 콜백 함수의 핵심 개념

// 콜백 함수를 받는 함수
function greetUser(name, callback) {
    console.log("안녕하세요, " + name + "님!");
    callback(); // 콜백 함수 실행
}

// 콜백 함수 정의
function showWelcome() {
    console.log("환영합니다!");
}

// 사용
greetUser("김철수", showWelcome);

실행 결과:

안녕하세요, 김철수님!
환영합니다!

기본 사용법

1단계: 간단한 콜백 함수

// 계산 후 결과를 처리하는 콜백
function calculate(a, b, callback) {
    let result = a + b;
    callback(result);
}

// 콜백 함수들
function showResult(result) {
    console.log("결과: " + result);
}

function doubleResult(result) {
    console.log("두 배: " + (result * 2));
}

// 사용 예제
calculate(5, 3, showResult);    // "결과: 8"
calculate(5, 3, doubleResult);  // "두 배: 16"

2단계: 익명 함수로 콜백 사용

// 익명 함수를 콜백으로 전달
calculate(10, 20, function(result) {
    console.log("계산 완료: " + result);
});

// 화살표 함수로 더 간단하게
calculate(4, 6, result => console.log("합계: " + result));

실행 결과:

결과: 8
두 배: 16
계산 완료: 30
합계: 10

3단계: 조건부 콜백

function processData(data, successCallback, errorCallback) {
    if (data && data.length > 0) {
        successCallback(data);
    } else {
        errorCallback("데이터가 없습니다");
    }
}

// 사용
processData(["A", "B", "C"], 
    data => console.log("성공:", data),
    error => console.log("오류:", error)
);

processData([],
    data => console.log("성공:", data),
    error => console.log("오류:", error)
);

실행 결과:

성공: ["A", "B", "C"]
오류: 데이터가 없습니다

실무 활용 예제

1. 배열 메서드에서의 콜백

let numbers = [1, 2, 3, 4, 5];

// forEach: 각 요소에 콜백 실행
numbers.forEach(num => console.log(num * 2));

// map: 콜백 결과로 새 배열 생성
let doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]

// filter: 콜백 조건에 맞는 요소만 선택
let evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // [2, 4]

2. 이벤트 처리

// 버튼 클릭 이벤트 (브라우저 환경)
let button = document.getElementById('myButton');
if (button) {
    button.addEventListener('click', function() {
        console.log("버튼이 클릭되었습니다!");
    });
}

// 더 간단하게
button?.addEventListener('click', () => {
    console.log("클릭됨!");
});

3. 타이머 함수

// setTimeout: 지연 실행
setTimeout(() => {
    console.log("3초 후 실행");
}, 3000);

// setInterval: 반복 실행
let count = 0;
let timer = setInterval(() => {
    count++;
    console.log("카운트: " + count);

    if (count >= 5) {
        clearInterval(timer); // 타이머 종료
        console.log("타이머 완료");
    }
}, 1000);

4. API 호출 시뮬레이션

// 가상의 API 함수
function fetchUser(id, onSuccess, onError) {
    // 실제로는 서버 요청
    setTimeout(() => {
        if (id === 1) {
            onSuccess({ id: 1, name: "김철수", email: "kim@example.com" });
        } else {
            onError("사용자를 찾을 수 없습니다");
        }
    }, 1000);
}

// 사용
fetchUser(1, 
    user => console.log("사용자 정보:", user),
    error => console.log("에러:", error)
);

fetchUser(999,
    user => console.log("사용자 정보:", user),
    error => console.log("에러:", error)
);

실행 결과:

2
4
6
8
10
[2, 4, 6, 8, 10]
[2, 4]
3초 후 실행
카운트: 1
카운트: 2
...
사용자 정보: {id: 1, name: "김철수", email: "kim@example.com"}
에러: 사용자를 찾을 수 없습니다

주의사항

1. 콜백 지옥 (Callback Hell)

// ❌ 나쁜 예: 콜백이 중첩되어 복잡함
getData(function(a) {
    getMoreData(a, function(b) {
        getEvenMoreData(b, function(c) {
            // 너무 깊은 중첩...
        });
    });
});

// ✅ 개선: 함수 분리
function handleA(a) {
    getMoreData(a, handleB);
}

function handleB(b) {
    getEvenMoreData(b, handleC);
}

function handleC(c) {
    console.log("최종 결과:", c);
}

getData(handleA);

2. this 바인딩 주의

let obj = {
    name: "객체",

    // 일반 함수 메서드
    normalMethod: function() {
        setTimeout(function() {
            console.log(this.name); // undefined (this가 다름)
        }, 1000);
    },

    // 화살표 함수로 해결
    arrowMethod: function() {
        setTimeout(() => {
            console.log(this.name); // "객체" (this 유지)
        }, 1000);
    }
};

3. 에러 처리

// 콜백에서 에러 처리
function safeCallback(callback) {
    try {
        if (typeof callback === 'function') {
            callback();
        }
    } catch (error) {
        console.error("콜백 실행 중 오류:", error);
    }
}

// 사용
safeCallback(() => {
    throw new Error("테스트 에러");
});

마무리

콜백 함수는 JavaScript의 핵심 개념 중 하나로, 비동기 처리와 이벤트 기반 프로그래밍의 기초가 됩니다.

콜백 함수를 이해하면 JavaScript의 비동기 처리와 이벤트 기반 프로그래밍을 자유자재로 다룰 수 있습니다!