λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

ν•¨μˆ˜ 포인터 μ‚¬μš©λ²• & 예제 총정리

by 5566 2023. 11. 5.

1. ν•¨μˆ˜ ν¬μΈν„°λž€ 무엇인가

ν•¨μˆ˜ ν¬μΈν„°λŠ” C와 C++μ—μ„œ μ‚¬μš©λ˜λŠ” μ€‘μš”ν•œ κ°œλ… 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ν•¨μˆ˜ ν¬μΈν„°λŠ” 말 κ·ΈλŒ€λ‘œ ν•¨μˆ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” ν¬μΈν„°μž…λ‹ˆλ‹€. λ‹€λ₯Έ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν•¨μˆ˜ 포인터도 λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가진 λ³€μˆ˜λ‘œμ„œ μ„ μ–Έλ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 일반 λ³€μˆ˜κ°€ 값을 가진닀면, ν•¨μˆ˜ ν¬μΈν„°λŠ” ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό κ°€μ§‘λ‹ˆλ‹€.

ν•¨μˆ˜ ν¬μΈν„°λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  μˆ˜λ„ 있고, ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 전달할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜λ₯Ό λ™μ μœΌλ‘œ ν˜ΈμΆœν•˜κ³  λ‹€μ–‘ν•œ μ‹€ν–‰ 경둜λ₯Ό λ§Œλ“€ 수 있게 ν•΄μ€λ‹ˆλ‹€.

C의 ν•¨μˆ˜ ν¬μΈν„°λŠ” λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ μž‘μ„±λ©λ‹ˆλ‹€:

λ°˜ν™˜_νƒ€μž…(*포인터_이름)(맀개_λ³€μˆ˜_νƒ€μž…)

μ—¬κΈ°μ„œ 포인터_이름은 ν•¨μˆ˜ ν¬μΈν„°μ˜ 이름, λ°˜ν™˜_νƒ€μž…μ€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…, 맀개_λ³€μˆ˜_νƒ€μž…μ€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜ νƒ€μž…μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ λŸ°νƒ€μž„ μ‹œμ— μ–΄λ–€ ν•¨μˆ˜κ°€ 싀행될 것인지 λ™μ μœΌλ‘œ κ²°μ •ν•  수 있으며, 이λ₯Ό 톡해 λ‹€ν˜•μ„±κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μ€ 콜백 ν•¨μˆ˜ 및 ν•¨μˆ˜ 포인터 λ°°μ—΄κ³Ό 같은 κ³ κΈ‰ ν”„λ‘œκ·Έλž˜λ° 기법에 μœ μš©ν•˜κ²Œ ν™œμš©λ©λ‹ˆλ‹€.

2. ν•¨μˆ˜ ν¬μΈν„°μ˜ μ„ μ–Έκ³Ό μ΄ˆκΈ°ν™”

ν•¨μˆ˜ 포인터λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λŠ” 방법은 λ‹€λ₯Έ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λŠ” 방법과 μœ μ‚¬ν•©λ‹ˆλ‹€. λ‹€λ§Œ ν•¨μˆ˜ ν¬μΈν„°μ˜ νƒ€μž…μ€ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜μ™€ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € λ°˜ν™˜ νƒ€μž…κ³Ό 맀개 λ³€μˆ˜ νƒ€μž…μ„ 지정해야 ν•©λ‹ˆλ‹€. 그리고 μ„ μ–Έν•  ν•¨μˆ˜ ν¬μΈν„°μ˜ 이름을 μ •ν•˜κ³  포인터 μ—°μ‚°μž *을 μ‚¬μš©ν•˜μ—¬ ν¬μΈν„°μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

int (*add)(int, int);

μœ„μ˜ μ˜ˆμ œλŠ” "add"λΌλŠ” 이름을 κ°€μ§€λŠ” λ°˜ν™˜ νƒ€μž…μ΄ int이고 맀개 λ³€μˆ˜ νƒ€μž…μ΄ int인 ν•¨μˆ˜ 포인터λ₯Ό μ„ μ–Έν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ €λ©΄ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•¨μˆ˜ 이름은 ν•¨μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλœ μ£Όμ†Œμ΄λ―€λ‘œ, 이름을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 ν˜•νƒœλ‘œ ν•¨μˆ˜ 포인터λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

add = &func_name;

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” "func_name"μ΄λΌλŠ” ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό "add" ν•¨μˆ˜ 포인터에 ν• λ‹Ήν•©λ‹ˆλ‹€. 포인터 μ—°μ‚°μž &λŠ” ν•΄λ‹Ή λ³€μˆ˜μ˜ μ£Όμ†Œλ₯Ό κ°€μ Έμ˜€λŠ” 역할을 ν•©λ‹ˆλ‹€.

λ˜λŠ” κ°„λ‹¨ν•˜κ²Œ λ‹€μŒκ³Ό 같이 μ΄ˆκΈ°ν™”ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

add = func_name;

μœ„μ˜ μ˜ˆμ œλŠ” ν•΄λ‹Ή ν•¨μˆ˜μ˜ 이름을 ν•¨μˆ˜ 포인터에 λ°”λ‘œ ν• λ‹Ήν•˜λŠ” κ²ƒμœΌλ‘œ, μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μ£Όμ†Œλ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ ν•¨μˆ˜ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜κ³  인자λ₯Ό 전달해야 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

int result = (*add)(2, 3);

μœ„μ˜ μ˜ˆμ œλŠ” "add" ν•¨μˆ˜ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜μ—¬ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , 인자둜 2와 3을 μ „λ‹¬ν•˜μ—¬ μ‹€ν–‰ν•œ ν›„ κ²°κ³Όλ₯Ό "result" λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ ν¬μΈν„°λŠ” λ‹€λ₯Έ λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€μ–‘ν•œ ν•¨μˆ˜λ“€μ„ 가리킬 수 있으며, λŸ°νƒ€μž„ λ™μ•ˆ νŠΉμ • ν•¨μˆ˜λ₯Ό λ™μ μœΌλ‘œ 선택할 수 μžˆλŠ” μœ μ—°μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

3. ν•¨μˆ˜ 포인터λ₯Ό ν™œμš©ν•œ 예제

ν•¨μˆ˜ ν¬μΈν„°λŠ” λ‹€ν˜•μ„±κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•˜λŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹€λ₯Έ ν•¨μˆ˜λ“€μ„ 가리킀고 λ™μ μœΌλ‘œ ν˜ΈμΆœν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 경둜λ₯Ό κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ μ˜ˆμ œλŠ” ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚°μˆ  연산을 μˆ˜ν–‰ν•˜λŠ” κ°„λ‹¨ν•œ 계산기λ₯Ό κ΅¬ν˜„ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    return a / b;
}

int main() {
    int (*calculator)(int, int);

    char operator;
    int operand1, operand2;

    printf("Enter an arithmetic operation (+, -, *, /): ");
    scanf("%c", &operator);

    printf("Enter two operands: ");
    scanf("%d %d", &operand1, &operand2);

    switch(operator) {
        case '+':
            calculator = add;
            break;
        case '-':
            calculator = subtract;
            break;
        case '*':
            calculator = multiply;
            break;
        case '/':
            calculator = divide;
            break;
        default:
            printf("Invalid operator\n");
            return 1;
    }

    int result = (*calculator)(operand1, operand2);

    printf("Result: %d\n", result);

    return 0;
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” add, subtract, multiply, divideλΌλŠ” 4개의 ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 각 ν•¨μˆ˜λŠ” 2개의 μ •μˆ˜ 맀개 λ³€μˆ˜λ₯Ό λ°›κ³  ν•΄λ‹Ή 연산을 μˆ˜ν–‰ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

main ν•¨μˆ˜μ—μ„œλŠ” calculatorλΌλŠ” ν•¨μˆ˜ 포인터λ₯Ό μ„ μ–Έν•˜κ³  μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. μ‚¬μš©μžλ‘œλΆ€ν„° μ‚°μˆ  μ—°μ‚°μžμ™€ 두 개의 ν”Όμ—°μ‚°μžλ₯Ό μž…λ ₯받은 ν›„, switch 문을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μ—°μ‚°μžμ— λ§žλŠ” μ—°μ‚° ν•¨μˆ˜λ₯Ό calculator에 ν• λ‹Ήν•©λ‹ˆλ‹€.

이후, calculator ν•¨μˆ˜ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜μ—¬ μ„ νƒλœ μ—°μ‚° ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  ν”Όμ—°μ‚°μžλ₯Ό μ „λ‹¬ν•˜μ—¬ κ²°κ³Όλ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œλŠ” ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 개의 ν•¨μˆ˜λ₯Ό μœ μ—°ν•˜κ²Œ μ„ νƒν•˜κ³  ν˜ΈμΆœν•  수 μžˆλŠ” 동적인 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μœ ν˜•μ˜ μ½”λ“œλŠ” 콜백 ν•¨μˆ˜, 이벀트 처리기 λ“±μ—μ„œ 많이 ν™œμš©λ©λ‹ˆλ‹€.

4. ν•¨μˆ˜ 포인터 λ°°μ—΄

ν•¨μˆ˜ 포인터 배열은 μ—¬λŸ¬ 개의 ν•¨μˆ˜ 포인터λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μž…λ‹ˆλ‹€. 이λ₯Ό μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ ν•¨μˆ˜ μ€‘μ—μ„œ ν•„μš”ν•œ ν•¨μˆ˜λ₯Ό μ„ νƒν•˜κ³  ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ 포인터 배열은 λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ μ„ μ–Έλ©λ‹ˆλ‹€:

return_type (*array_name[size])(parameter_type);

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” return_type은 λ°˜ν™˜ νƒ€μž…μ„, array_name은 λ°°μ—΄μ˜ 이름을, sizeλŠ” λ°°μ—΄μ˜ 크기λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. parameter_type은 ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄κ³ , return_type은 ν•΄λ‹Ή ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터 배열을 μ΄ˆκΈ°ν™”ν•˜λŠ” 방법은 λ°°μ—΄ μš”μ†Œμ— ν•΄λ‹Ήν•˜λŠ” ν•¨μˆ˜λ“€μ˜ μ£Όμ†Œλ₯Ό μ°¨λ‘€λŒ€λ‘œ ν• λ‹Ήν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

int sum(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int (*calculator[3])(int, int) = {sum, subtract, multiply};

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” calculatorλΌλŠ” ν•¨μˆ˜ 포인터 배열을 μ„ μ–Έν•˜κ³  sum, subtract, multiply ν•¨μˆ˜λ“€μ˜ μ£Όμ†Œλ₯Ό μ°¨λ‘€λŒ€λ‘œ ν• λ‹Ήν•˜μ—¬ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. λ°°μ—΄μ˜ ν¬κΈ°λŠ” 3이며, 각 μš”μ†Œμ˜ νƒ€μž…μ€ int (*)(int, int)둜, λ°˜ν™˜ νƒ€μž…μ΄ int이고 맀개 λ³€μˆ˜ νƒ€μž…μ΄ int인 ν•¨μˆ˜ 포인터λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터 배열을 μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ €λ©΄ ν•΄λ‹Ή ν•¨μˆ˜ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜κ³  인자λ₯Ό 전달해야 ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

int result = (*calculator[0])(2, 3);

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” calculator λ°°μ—΄μ˜ 첫 번째 μš”μ†ŒμΈ sum ν•¨μˆ˜ 포인터λ₯Ό μ—­μ°Έμ‘°ν•˜μ—¬ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , 인자둜 2와 3을 μ „λ‹¬ν•˜μ—¬ μ‹€ν–‰ν•œ ν›„ κ²°κ³Όλ₯Ό result λ³€μˆ˜μ— μ €μž₯ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터 배열은 ν•¨μˆ˜ 포인터듀을 μœ μ—°ν•˜κ²Œ κ΄€λ¦¬ν•˜κ³  λ™μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ—¬λŸ¬ 개의 ν•¨μˆ˜λ₯Ό 효율적으둜 μ„ νƒν•˜κ³  μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. ν•¨μˆ˜ 포인터와 콜백 ν•¨μˆ˜

ν•¨μˆ˜ 포인터와 콜백 ν•¨μˆ˜λŠ” C ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 자주 μ‚¬μš©λ˜λŠ” 기법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 ν•¨μˆ˜μ˜ λ™μž‘μ„ λ‹€λ₯Έ ν•¨μˆ˜μ—κ²Œ μ•Œλ¦΄ 수 있으며, ν”„λ‘œκ·Έλž¨μ˜ μœ μ—°μ„±κ³Ό ν™•μž₯성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ 포인터와 콜백 ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 ν•¨κ»˜ μ‚¬μš©λ©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터

ν•¨μˆ˜ ν¬μΈν„°λŠ” ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€. C μ–Έμ–΄μ—μ„œλŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ ν•΄λ‹Ή ν•¨μˆ˜μ˜ 이름을 μ‚¬μš©ν•˜μ—¬ ν˜ΈμΆœν•˜μ§€λ§Œ, ν•¨μˆ˜ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό λ³€μˆ˜λ‘œ μ €μž₯ν•˜κ³  ν•„μš”ν•œ λ•Œμ— ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό 가리킬 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ ν•¨μˆ˜ 포인터λ₯Ό μ„ μ–Έν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€:

return_type (*function_ptr)(parameter_type);

μœ„μ˜ μ˜ˆμ œμ—μ„œ return_type은 λ°˜ν™˜ νƒ€μž…μ„, function_ptr은 ν•¨μˆ˜ ν¬μΈν„°μ˜ 이름을, parameter_type은 ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜ νƒ€μž…μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ν•¨μˆ˜ ν¬μΈν„°λŠ” 주둜 ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ ν•¨μˆ˜μ—κ²Œ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

콜백 ν•¨μˆ˜

콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 콜백 ν•¨μˆ˜λŠ” ν•¨μˆ˜ 포인터λ₯Ό 톡해 참쑰되며, ν•΄λ‹Ή ν•¨μˆ˜μ˜ λ™μž‘μ€ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ— μ˜ν•΄ κ²°μ •λ©λ‹ˆλ‹€. 콜백 ν•¨μˆ˜λŠ” 이벀트 처리, 비동기 μž‘μ—…, μ •λ ¬ κΈ°λŠ₯ λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

콜백 ν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€:

return_type callback_function(parameter_type);

콜백 ν•¨μˆ˜λŠ” ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜κ°€ ν•„μš”ν•œ μ‹œμ μ— ν•¨μˆ˜ 포인터λ₯Ό 톡해 ν˜ΈμΆœλ©λ‹ˆλ‹€. ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜μ—μ„œλŠ” 인자둜 콜백 ν•¨μˆ˜μ˜ 포인터와 ν•„μš”ν•œ 데이터λ₯Ό μ „λ‹¬ν•˜μ—¬ 콜백 ν•¨μˆ˜κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터와 콜백 ν•¨μˆ˜μ˜ ν™œμš©

μ•„λž˜ μ˜ˆμ œλŠ” 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μˆ˜ 배열을 μ •λ ¬ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. 이 μ˜ˆμ œμ—μ„œλŠ” 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •λ ¬μ˜ 방식을 μ™ΈλΆ€μ—μ„œ κ²°μ •ν•  수 μžˆλ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

#include <stdio.h>

void bubbleSort(int arr[], int size, int (*compare)(int, int)) {
    for(int i = 0; i < size - 1; i++) {
        for(int j = 0; j < size - i - 1; j++) {
            if((*compare)(arr[j], arr[j+1])) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

int ascendingOrder(int a, int b) {
    return a > b;
}

int descendingOrder(int a, int b) {
    return a < b;
}

void printArray(int arr[], int size) {
    for(int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {5, 3, 1, 4, 2};
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("Original array: ");
    printArray(arr, size);

    printf("Sorted in ascending order: ");
    bubbleSort(arr, size, ascendingOrder);
    printArray(arr, size);

    printf("Sorted in descending order: ");
    bubbleSort(arr, size, descendingOrder);
    printArray(arr, size);

    return 0;
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ bubbleSort ν•¨μˆ˜λŠ” 정렬을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ λΉ„κ΅ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν•¨μˆ˜ 포인터λ₯Ό 인자둜 λ°›μŠ΅λ‹ˆλ‹€. 이 덕뢄에 μ •λ ¬μ˜ 방식을 μ™ΈλΆ€μ—μ„œ μ„€μ •ν•  수 있게 λ©λ‹ˆλ‹€.

ascendingOrder와 descendingOrder ν•¨μˆ˜λŠ” 비ꡐ ν•¨μˆ˜λ‘œ, μ •λ ¬ 방식에 따라 두 개의 숫자λ₯Ό λΉ„κ΅ν•˜λŠ” κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. printArray ν•¨μˆ˜λŠ” λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ 좜λ ₯ν•˜λŠ” helper ν•¨μˆ˜μž…λ‹ˆλ‹€.

main ν•¨μˆ˜μ—μ„œλŠ” μ •μˆ˜ 배열을 μƒμ„±ν•˜κ³ , bubbleSort ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 배열을 μ •λ ¬ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” ascendingOrder ν•¨μˆ˜μ™€ descendingOrder ν•¨μˆ˜λ₯Ό 각각 콜백 ν•¨μˆ˜λ‘œ μ‚¬μš©ν•˜μ—¬ μ˜€λ¦„μ°¨μˆœκ³Ό λ‚΄λ¦Όμ°¨μˆœ 정렬을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 포인터와 콜백 ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ˜ μœ μ—°μ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μ–‘ν•œ λ™μž‘μ„ κ²°μ •ν•˜λŠ” ν•¨μˆ˜λ₯Ό 생성할 수 있으며, 이λ₯Ό 톡해 μœ μ—°ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€