본문 바로가기
프로그래밍언어/C 언어

[혼자 공부하는 C언어] 함수 포인터의 활용

by khsnote22 2022. 12. 15.

http://www.yes24.com/Product/Goods/74269921

 

혼자 공부하는 C 언어 - YES24

혼자 해도 충분하다! 1:1 과외하듯 배우는 C 프로그래밍 자습서이 책은 독학으로 C 언어를 배우는 입문자가 ‘꼭 필요한 내용을 제대로’ 학습할 수 있도록 구성했다. ‘무엇을’ ‘어떻게’ 학

www.yes24.com


함수 포인터는 함수의 형태만 같으면 기능과 상관없이 모든 함수에 사용할 수 있습니다. 따라서 형태가 같은 다양한 기능의 함수를 선택적으로 호출할 때 사용합니다.

 

#include <stdio.h>

void func(int (*fp)(int, int)); // 함수 포인터를 매개변수로 갖는 함수
int sum(int a, int b); // 두 정수를 더하는 함수
int mul(int a, int b); // 두 정수를 곱하는 함수
int max(int a, int b); // 두 정수 중에 큰 값을 구하는 함수

int main(void)
{
    int sel; // 선택된 메뉴 번호를 저장할 변수
    
    printf("01. 두 정수의 합\n"); // 메뉴 출력
    printf("02. 두 정수의 곱\n");
    printf("03. 두 정수 중에서 큰 값 계산\n");
    printf("원하는 연산을 선택하세요 : ");
    scanf("%d", &sel); // 메뉴 번호 입력
    
    switch(sel)
    {
        case 1: func(sum); break; // 1이면 func에 덧셈 기능 추가
        case 2: func(mul); break; // 2이면 func에 덧셈 기능 추가
        case 3: func(max); break; // 3이면 func에 덧셈 기능 추가
    }
    return 0;
}

void func(int (*fp)(int, int))
{
    int a, b; // 두 정수를 저장할 변수
    int res; // 함수의 반환값을 저장할 변수
    
    printf("두 정수의 값을 입력하세요 : ");
    scanf("%d%d, &a, &b"); // 두 정수 입력
    res = fp(a,b) // 함수 포인터로 가리는 함수를 호출
    printf("결과값은 : %d\n", res); // 반환값 출력
}

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

int mul(int a, int b)
{
    return (a *b)
}
int max(int a, int b)
{
    if (a>b) return a;
    else return b;
}

이 프로그램은 함수를 정의할 때 일부를 구현하지 않고 함수가 호출될 때 그 기능을 결정합니다. 

 

func 함수 안에서는 함수 포인터인 매개변수 fp가 함수명을 저장하여 해당 함수를 가리키므로 fp를 통해 해당 기능을 가진 함수를 호출할 수 있습니다. 

어떤 경우에 함수 포인터를 써야 할까요?
굳이 함수 포인터를 쓰지 않아도 func 함수는 필요한 함수를 직접 호출하여 같은 기능을 하는 코드를 만들 수 있습니다. 그러나 만약 func 함수만 따로 만드는 경우 만드는 시점에서 연산 방법을 결정할 수 없다면 일단 함수 포인터를 쓰고 나중에 func 함수를 호출하는 곳에서 연산 방법을 함수로 구현할 수 있습니다. 그 밖에 하나의 프로그램이 여러 개의 파일로 분리되어 있는 경우 다른 파일에 있는 정적 함수를 호출하는 방법으로 함수 포인터를 쓸 수 있습니다.