Menu
Coddy logo textTech

함수 포인터 선언

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

지금까지 우리는 struct embedding을 사용하여 상속을 흉내 내는 방법을 배웠습니다. 하지만 서로 다른 객체가 동일한 호출에 다르게 반응하는 진정한 다형성을 구현하려면 한 가지가 더 필요합니다. 바로 function pointers입니다.

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

구문이 처음에는 다소 복잡해 보일 수 있습니다. 함수 포인터를 선언하려면 먼저 반환 타입을 지정한 다음, 괄호 안에 별표(*)와 함께 포인터 이름을 적고, 이어서 매개변수 타입을 지정합니다.

int (*operation)(int, int);

이것은 두 개의 int parameters를 받고 int를 returning하는 어떤 function이든 point할 수 있는 operation이라는 이름의 변수를 Declare합니다. *operation을 둘러싼 괄호는 매우 중요하며, 괄호가 없으면 pointer를 return하는 function을 선언하게 됩니다.

이 포인터에 함수를 할당하려면, 괄호 없이 함수의 이름만 사용하면 됩니다:

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은 multiply, 2는 subtract)
  4. 연산 코드에 따라 operation 포인터에 적절한 함수를 할당합니다
  5. 할당된 연산의 이름을 출력한 다음, 포인터를 통해 함수를 호출한 결과를 출력합니다

입력으로 첫 번째 숫자, 두 번째 숫자, 그리고 연산 코드(1 또는 2)의 세 가지 값이 주어집니다.

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

Operation: multiply
Result: 35

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

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

직접 해보기

#include <stdio.h>

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


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


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

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

Object Oriented Programming의 모든 레슨