1. callback 

  • 라이브러리 에서 우리가 만든 함수를 호출하는 경우...
  • 이렇게 역방향으로 호출되는 함수를 Callback 함수라고 한다.
  • 예를 들어 라이브러리에 생일축하 노래불러주는 함수가 있다고 해보자.
  • 사랑하는 땡땡땡~ 이부분은 우리의 목소리를 넣고 싶다.
  • 그러면, 땡땡땡에 무엇을 넣어야할지를 라이브러리에 알려주기 위해,
  • 만드는 함수가 Callback 함수이다.
  • 우리는 callback 함수를 만들고 , 이 힘수의 포인터를 라이브러리에 알려주면,
  • 라이브러리는 땡땡땡이 나오는 순간, Callback 함수를 호출하여 생일축하 노래를 완성한다.,
  • 그 예로 표준함수중, 데이터를 정렬하는 기능을 수행하는 qsort()가 있다.
  • 퀵소트 함수인데.
  • 데이터타입은 개발자가 정할 수 있다.
  • 그래서 데이터를 비교하는 기능은 개발자가 Callback 함수로 만들어 라이브러리에 제공하도록 하였다.
  • 정렬시 어떤 데이터가 앞으로, 어떤 데이터가 뒤로 갈지를 라이브러리에서 결정하는 것이 아니라, 개발자가 정한다.
  • 이렇게 하면 기본 데이터 타입 뿐 아니라 , 개발자가 정의 한 구조체에 대해서도 정렬을 할 수 있고, 오름 차순인지, 내림차순정렬인지 등을 개발자 마음대로 변경할 수 있어 유연성이 엄청나게 증가한다.


#include <stdio.h>
#include <stdlib.h>

#define  NUM 10

int ascending(const void*a , const void*b)
{
    if (*(int*) a > *(int*) b)
        return 1;      
    else if (*(int*) a < *(int*) b)
        return -1;           
    else           
        return 0;                 
}

int descending(const void*a , const void*b)
{
    if (*(int*) a < *(int*) b)
        return 1;       
    else if (*(int*) a > *(int*) b)
        return -1;           
    else           
        return 0;                 
}

void output(int *data, int size)
{
    for (int i=0; i<size; i++) 
        printf("%d ", data[i]);
    puts(""); 
}

void main()
{
    int data[NUM]= { 10,20,30,40,9023,1231,2345,343,123,532 };
    qsort(data, NUM, sizeof(int) , ascending);
    output(data, NUM);
    qsort(data, NUM, sizeof(int) , descending);
    output(data, NUM);       
}


#include <stdio.h>
void test_func(void (*func)(int aa,int bb), int a, int b)
{
    printf("I am Test Function\n");

    //callback function call
    func(a, b);
}

void call_back_func_1(int a, int b)
{
    printf("I am CallBack Function1 -- a=%d,b=%d\n", a,b);
}

void call_back_func_2(int a,int b)
{
    printf("I am CallBack Function2 -- a=%d,b=%d\n", a,b);
}

int main(int argc, char **argv)
{
        int answer1;
        int answer2;

        if (argc != 3) {
                printf("err argc = %d\n",argc);
                return -1;
        }
    answer1 = atoi(*(argv + 1));
    answer2 = atoi(*(argv + 2));
        switch (answer1)
        {
        case 1:
                 test_func(call_back_func_1, answer1,answer2);
                 break;
        case 2:
                 test_func(call_back_func_2, answer1,answer2);
                 break;
        }
        return 0;
}


'dev > C' 카테고리의 다른 글

가변 인자 함수(va_list, va_start, va_arg, va_end)  (0) 2013.02.19
시간 측정을 위한 gettimeofday 사용예제  (0) 2012.12.19
[C언어] assert()  (0) 2010.11.09
문자열 처리 함수  (0) 2010.11.05

+ Recent posts