Menu
Coddy logo textTech

함수 포인터를 위한 Typedef

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

이미 보셨듯이, 함수 포인터 선언은 읽기 어려울 수 있습니다. 여러 곳에서 동일한 함수 포인터 타입을 사용해야 할 때, 구문이 반복적이고 오류가 발생하기 쉬워집니다. 이럴 때 typedef가 큰 도움이 됩니다.

typedef 키워드를 사용하면 함수 포인터를 포함한 모든 타입에 대한 별칭(alias)을 생성할 수 있습니다. 매번 전체 선언을 작성하는 대신, 타입을 한 번 정의하고 코드 전체에서 별칭을 사용할 수 있습니다.

함수 포인터 선언을 typedef로 변환하는 방법은 다음과 같습니다:

// typedef가 없는 경우 (복잡함):
int (*operation)(int, int);

// typedef를 사용하는 경우 (깔끔함):
typedef int (*Operation)(int, int);

Operation op;  // 훨씬 더 깔끔합니다!

구문은 일반적인 함수 포인터 선언과 유사하지만, 시작 부분에 typedef가 붙습니다. 선택한 이름(여기서는 Operation)은 "두 개의 int를 인자로 받고 int를 반환하는 함수에 대한 포인터"를 나타내는 새로운 타입이 됩니다.

이제 이 타입을 어디에서나 사용할 수 있습니다:

typedef int (*Operation)(int, int);

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

int main() {
    Operation op1 = add;
    Operation op2 = multiply;
    
    printf("%d\n", op1(3, 4));  // 출력: 7
    printf("%d\n", op2(3, 4));  // 출력: 12
    return 0;
}

이 접근 방식은 함수 포인터를 매개변수로 전달하거나 구조체에 저장할 때 특히 유용하며, 이는 우리가 다형성을 구현해 나가는 과정에서 자주 접하게 될 상황들입니다.

challenge icon

챌린지

쉬움

비교 함수 포인터 타입을 위한 깔끔한 별칭을 만들기 위해 typedef를 사용하는 연습을 해봅시다. 두 정수를 비교하는 함수를 나타내는 타입을 정의한 다음, 이를 사용하여 변수를 선언하고 서로 다른 비교 함수를 호출해 볼 것입니다.

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

  1. 다음과 같은 함수 포인터 타입에 대해 Comparator라는 이름의 typedef를 생성합니다:
    • 두 개의 int 매개변수를 받음
    • int를 반환함 (첫 번째 값이 작으면 음수, 같으면 0, 첫 번째 값이 크면 양수)
  2. 두 개의 비교 함수를 정의합니다:
    • ascending — 오름차순을 나타내는 값을 반환 (첫 번째 값 - 두 번째 값)
    • descending — 내림차순을 나타내는 값을 반환 (두 번째 값 - 첫 번째 값)
  3. main 함수에서 (원래의 함수 포인터 구문이 아닌 작성한 typedef를 사용하여) Comparator 변수를 선언합니다.
  4. 세 개의 입력값(두 개의 정수와 정렬 코드(1은 오름차순, 2는 내림차순))을 읽습니다.
  5. 정렬 코드에 따라 적절한 함수를 Comparator 변수에 할당합니다.
  6. 두 숫자를 사용하여 comparator를 호출하고 결과를 출력한 뒤, 어떤 값이 먼저 와야 하는지를 나타내는 메시지를 출력합니다.

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

출력은 비교 결과를 보여준 다음, 결과의 부호에 따라 어떤 숫자가 먼저 오는지 표시해야 합니다:

Result: -5
First: 3

입력값이 3, 8, 1(오름차순)인 이 예시에서: 비교 결과는 3 - 8 = -5를 반환하며(음수는 오름차순에서 첫 번째 숫자가 먼저 옴을 의미), 따라서 First: 3을 출력합니다.

"First" 라인의 경우:

  • 결과가 음수이거나 0이면, 첫 번째 입력 숫자를 출력합니다.
  • 결과가 양수이면, 두 번째 입력 숫자를 출력합니다.

여기서 핵심 연습은 전체 함수 포인터 구문을 작성하는 대신 Comparator typedef를 사용하여 변수를 깔끔하게 선언하는 것입니다.

직접 해보기

#include <stdio.h>

// TODO: 두 개의 int 매개변수를 받고 int를 반환하는
// 함수 포인터 타입에 대한 'Comparator'라는 typedef를 생성하세요


// TODO: 'ascending' 비교 함수를 정의하세요
// (첫 번째 - 두 번째)를 반환해야 합니다


// TODO: 'descending' 비교 함수를 정의하세요
// (두 번째 - 첫 번째)를 반환해야 합니다


int main() {
    // 입력 읽기
    int num1, num2, orderCode;
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &orderCode);
    
    // TODO: 작성한 typedef를 사용하여 Comparator 변수를 선언하세요
    
    
    // TODO: orderCode에 따라 적절한 함수를 할당하세요
    // (1은 오름차순, 2는 내림차순)
    
    
    // TODO: comparator를 호출하고 결과를 저장하세요
    int result;
    
    
    // 결과 출력
    printf("Result: %d\n", result);
    
    // TODO: 결과에 따라 어떤 숫자가 먼저 오는지 출력하세요
    // 결과가 음수이거나 0이면 첫 번째 숫자를 출력합니다
    // 결과가 양수이면 두 번째 숫자를 출력합니다
    printf("First: %d\n", /* 여기에 로직 작성 */ 0);
    
    return 0;
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨