Menu
Coddy logo textTech

함수 포인터 선언

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

지금까지 우리는 구조체 임베딩(struct embedding)을 사용하여 상속을 시뮬레이션하는 방법을 배웠습니다. 하지만 서로 다른 객체가 동일한 호출에 대해 서로 다르게 반응하는 진정한 다형성(polymorphism)을 구현하려면 더 많은 것이 필요합니다. 바로 함수 포인터(function pointers)입니다.

함수 포인터는 함수의 주소를 저장하는 변수입니다. 일반 포인터가 데이터의 주소를 저장하는 것과 마찬가지로, 함수 포인터는 실행 가능한 코드의 주소를 저장합니다.

구문이 처음에는 생소하게 느껴질 수 있습니다. 함수 포인터를 선언하려면 반환 유형을 지정한 다음, 괄호 안에 별표(*)와 함께 포인터 이름을 지정하고, 이어서 매개변수 유형을 지정합니다:

int (*operation)(int, int);

이것은 두 개의 int 매개변수를 받고 int를 반환하는 모든 함수를 가리킬 수 있는 operation이라는 변수를 선언합니다. *operation을 둘러싼 괄호는 매우 중요합니다. 괄호가 없으면 포인터를 반환하는 함수를 선언하게 됩니다.

이 포인터에 함수를 할당하려면 단순히 함수의 이름(괄호 없이)을 사용하세요:

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

int (*operation)(int, int);
operation = add;  // 이제 operation은 add를 가리킵니다

함수 이름은 함수의 주소 역할을 합니다. &add를 명시적으로 사용할 수도 있지만, 이는 선택 사항입니다 — C 언어에서 두 형식은 동일합니다.

challenge icon

챌린지

쉬움

함수 포인터를 선언하고 함수를 할당하는 연습을 해봅시다. 함수 포인터가 서로 다른 산술 함수를 가질 수 있는 간단한 수학 연산 시스템을 만들 것입니다.

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

  1. 두 개의 함수를 정의합니다:
    • multiply — 두 개의 int 매개변수를 받아 그 곱을 반환합니다.
    • subtract — 두 개의 int 매개변수를 받아 첫 번째 값에서 두 번째 값을 뺀 결과를 반환합니다.
  2. main 함수에서, 두 개의 int 매개변수를 받고 int를 반환하는 함수를 가리킬 수 있는 operation이라는 이름의 함수 포인터 변수를 선언합니다.
  3. 세 개의 입력값(두 개의 정수와 연산 코드: 곱셈은 1, 뺄셈은 2)을 읽습니다.
  4. 연산 코드에 따라 적절한 함수를 operation 포인터에 할당합니다.
  5. 할당된 연산의 이름을 출력한 다음, 포인터를 통해 함수를 호출한 결과를 출력합니다.

세 개의 입력을 받게 됩니다: 첫 번째 숫자, 두 번째 숫자, 그리고 연산 코드 (1 또는 2).

출력은 다음과 같아야 합니다:

Operation: multiply
Result: 35

여기서 multiply는 연산 이름(코드가 2인 경우 subtract)이고, 35는 포인터를 통해 함수를 호출한 결과(이 경우 5 × 7)입니다.

기억하세요: 함수 포인터를 선언하려면 반환 타입, 괄호와 별표(*)가 포함된 포인터 이름, 그리고 매개변수 타입이 필요합니다. 함수를 할당할 때는 괄호 없이 함수 이름만 사용합니다.

치트 시트

함수 포인터(function pointer)는 함수의 주소를 저장하는 변수로, 동일한 포인터를 통해 서로 다른 함수를 호출할 수 있게 함으로써 다형성을 가능하게 합니다.

함수 포인터 선언하기

구문은 반환 타입, 괄호 안에 별표와 함께 쓰인 포인터 이름, 그리고 매개변수 타입을 지정합니다:

int (*operation)(int, int);

이것은 operation을 두 개의 int 매개변수를 받고 int를 반환하는 모든 함수에 대한 포인터로 선언합니다. *operation을 둘러싼 괄호는 필수적입니다.

포인터에 함수 할당하기

괄호 없이 함수 이름을 사용합니다:

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

int (*operation)(int, int);
operation = add;  // operation now points to add

함수 이름은 해당 함수의 주소 역할을 합니다. 명시적으로 &add를 사용할 수도 있지만, 이는 선택 사항입니다.

직접 해보기

#include <stdio.h>

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


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


int main() {
    int num1, num2, code;
    
    // 입력 읽기
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: 두 개의 int 매개변수를 받고 int를 반환하는 함수를 가리킬 수 있는
    // 'operation'이라는 이름의 함수 포인터를 선언하세요
    
    
    // TODO: 연산 코드(곱셈은 1, 뺄셈은 2)에 따라
    // operation 포인터에 적절한 함수를 할당하세요
    
    
    // TODO: 연산 이름과 결과를 출력하세요
    // 형식:
    // Operation: <이름>
    // Result: <결과>
    
    return 0;
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨