Menu
Coddy logo textTech

함수 포인터 호출

Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 34번째.

함수 포인터를 선언하고 함수를 할당하는 방법을 알게 되었으므로, 다음 단계는 실제로 해당 포인터를 통해 함수를 호출하는 것입니다.

구문은 간단합니다 — 일반 함수를 호출하는 것과 똑같이 함수 포인터를 사용하면 됩니다:

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

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // add(5, 3) 호출
    printf("%d\n", result);        // 출력: 8
    return 0;
}

포인터 이름 뒤에 인수를 포함하는 괄호를 작성하기만 하면 됩니다. C는 자동으로 포인터를 역참조하고 해당 포인터가 가리키는 함수를 실행합니다.

또한 (*operation)(5, 3)와 같이 명시적 역참조 구문을 사용할 수도 있지만, 이는 선택 사항이며 덜 일반적입니다. 두 형식 모두 동일한 결과를 생성합니다.

진정한 힘은 포인터를 다른 함수로 재할당할 때 나타납니다:

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

operation = subtract;
result = operation(5, 3);  // 이제 subtract(5, 3)을 호출합니다
printf("%d\n", result);    // 출력: 2

동일한 변수 operation은 이제 완전히 다른 로직을 실행합니다. 런타임에 동작을 교체하는 이 능력은 C 언어에서 다형성의 기초가 됩니다.

challenge icon

챌린지

쉬움

포인터를 통해 함수를 호출하고 실행되는 함수를 교체하는 연습을 해봅시다. 런타임에 덧셈과 뺄셈 사이를 전환할 수 있는 간단한 계산기를 만들어 보겠습니다.

다음과 같은 프로그램을 작성하세요:

  1. 두 개의 함수를 정의합니다:
    • add — 두 개의 int 매개변수를 받아 그 합을 반환합니다.
    • subtract — 두 개의 int 매개변수를 받아 첫 번째 값에서 두 번째 값을 뺀 결과를 반환합니다.
  2. main 함수에서, 두 개의 int 매개변수를 받고 int를 반환하는 함수를 가리킬 수 있는 calc라는 이름의 함수 포인터를 선언합니다.
  3. 네 개의 입력값(두 개의 정수와 두 개의 연산 코드)을 읽습니다.
  4. 각 연산 코드에 대해 다음을 수행합니다:
    • calc에 적절한 함수를 할당합니다 (1은 add, 2는 subtract).
    • 포인터를 통해 두 숫자를 인자로 전달하여 함수를 호출합니다.
    • 결과를 출력합니다.

입력으로 첫 번째 숫자, 두 번째 숫자, 첫 번째 연산 코드 (1 또는 2), 그리고 두 번째 연산 코드 (1 또는 2)의 네 가지 값을 받게 됩니다.

출력은 동일한 두 숫자를 사용하여 수행된 각 연산에 대해 하나씩, 두 개의 결과를 별도의 줄에 표시해야 합니다:

15
5

이 예시에서 입력이 10, 5, 1, 2인 경우: 첫 번째 연산(코드 1)은 10 + 5 = 15를 수행하고, 그 다음 포인터가 재할당되어 두 번째 연산(코드 2)은 10 - 5 = 5를 수행합니다.

이것은 동일한 포인터 변수가 호출 사이에 재할당됨으로써 어떻게 완전히 다른 로직을 실행할 수 있는지 보여줍니다.

치트 시트

포인터를 통해 함수를 호출하려면, 포인터 이름 뒤에 인수가 포함된 괄호를 사용합니다:

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

int main() {
    int (*operation)(int, int) = add;
    
    int result = operation(5, 3);  // add(5, 3)을 호출합니다
    printf("%d\n", result);        // 출력: 8
    return 0;
}

명시적인 역참조 구문인 (*operation)(5, 3)을 사용할 수도 있지만, 이는 선택 사항입니다.

함수 포인터는 런타임에 다른 함수를 가리키도록 재할당될 수 있습니다:

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

operation = subtract;
result = operation(5, 3);  // 이제 subtract(5, 3)을 호출합니다
printf("%d\n", result);    // 출력: 2

이를 통해 동일한 포인터 변수가 호출 사이에 재할당됨으로써 서로 다른 로직을 실행할 수 있게 됩니다.

직접 해보기

#include <stdio.h>

// TODO: 여기에 add 함수를 정의하세요


// TODO: 여기에 subtract 함수를 정의하세요


int main() {
    // 입력 읽기
    int num1, num2, op1, op2;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &op1);
    scanf("%d", &op2);
    
    // TODO: 두 개의 int 매개변수를 받고 int를 반환하는 함수를 가리킬 수 있는
    // 'calc'라는 이름의 함수 포인터를 선언하세요
    
    
    // TODO: 첫 번째 연산 코드(op1)에 대하여:
    // - calc에 적절한 함수를 할당하세요 (1은 add, 2는 subtract)
    // - 포인터를 통해 함수를 호출하고 결과를 출력하세요
    
    
    // TODO: 두 번째 연산 코드(op2)에 대하여:
    // - calc를 적절한 함수로 다시 할당하세요
    // - 포인터를 통해 함수를 호출하고 결과를 출력하세요
    
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨