번  호 : 130 
게시자 : 김태호   (drgui   ) 
등록일 : 1999-09-05 04:00 
제  목 : [질문] callback함수 좀 갈쳐주세여...     

callback함수가 어떻게 구동되는 건지... 
답답하네요... 
공부하다보면 callback함수가 종종 등장해서 식은 땀을 나게하는데 정말..ㅠㅠ 
누가 이 답답한 맘을 속 시원히 뚫어 줄 분... 
그 은혜는 두고두고... 
^^... 

한가지 더, 
이 노무 callback에 대해 시원히 설명해 줄 분..... 
alvatros@thrunet.com으로 멜 주시면 정말..ㅠㅠ.. 

번  호 : 131 
게시자 : 손광현   (drakan  ) 
등록일 : 1999-09-06 06:18 
제  목 : [답변] 130, Callback function           

1. Prologue 

Callback 이라고 하면 회수한다는 뜻이죠.. 
그래서 "callback function"을 직역하면 "회수함수" 정도 되겠네요.. ^^;; 
하지만 "callback function"을 "회수함수"라고 번역하는 책이 있으면 절대로 보지 
마십시요.. ^^;; 이미 사셨다면 책꽂이 장식용으로 사용하세요.. ^^;; 대부분 그런 
책은 두껍고.. 제목도 멋있거든요~ ^^;; (아마 X각형 책은 거진 그럴껍니다.. 헐.. 
이러다 출판사에서 고발당하면 어쩌쥐~ 푸푸..) 


2. Callback의 정의 

Callback function은 상황에 의해 정의되는 용어입니다. 언어나 O/S 등에 국한되 
지않는 일반적인 용어이지요.. 일반적으로 Callback function은 Package 형태의 Software Library 를 사용할때 많이 사용하게 됩니다.. 

Structured Programing 개발방법론에서 polymorphism을 구현하기 위해 고안된 일 
종의 Trick 이라고도 할 수 있습니다.. Object Oriented Programing에서는 이러한 
문제를 Inheritance/Function Overload 등을 이용해 구현하고 있습니다... 하지만 
여전히 OOP에서도 Callback function의 개념을 사용합니다.. 그만큼 간편하면서도 
강력한 polymorphism을 구현할 수 있는 방법이기 때문이겠지요.. ^^;; 


3. Callback의 예 

이해를 돕기위해서 한가지를 예를 만들어 보도록 하겠습니다. 

NOTE_1 : 
1) 아래의 예제는 C++ 분할 컴파일을 사용해 구현되었습니다. 주어진 개발환경 
    에서 분할 컴파일 사용법을 익히신 후 사용하시기 바랍니다. 
2) 아래 file을 모두 동일한 Directory에 생성하시고 컴파일 환경에서 새로운 
    Project를 생성한 후 main.cpp / package.cpp 를 추가하시기 바랍니다. 

/* 
        File Name : callback.h 

        Copyright : Free. 

        Creation Date : 1999.9.5. 
        Previous Author : None. 
        Main Author : Kwang Hyun, Shaun.(E-mail : drakan@hitel.net) 

        Comment : Header file for callback function prototype definition. 
-------------------------------------------------------------------------*/ 

#ifndef _CALLBACK_INC_ 
#define _CALLBACK_INC_ 


/*    Standard header file list 
-------------------------------------------------------------------------*/ 
#include <stdio.h> 


/*    Callback function prototype 
-------------------------------------------------------------------------*/ 
typedef int (*CALLBACK) (int); 


#endif //_CALLBACK_INC_ 

/*        File End. 
-------------------------------------------------------------------------*/ 




/* 
        File Name : package.cpp 

        Copyright : Free. 

        Creation Date : 1999.9.5. 
        Previous Author : None. 
        Main Author : Kwang Hyun, Shaun.(E-mail : drakan@hitel.net) 

        Comment : Sample code for callback function understanding. 
-------------------------------------------------------------------------*/ 

#include "callback.h" 

int print_integer (CALLBACK pfn_Callback, int n) 

        int i; 

        for (i = 0 ; i < n ; i++) 
                printf ("%d, ", pfn_Callback(i)); 
        printf ("\n"); 

        return n; 


/*        File End. 
-------------------------------------------------------------------------*/ 




/* 
        File Name : main.cpp 

        Copyright : Free. 

        Creation Date : 1999.9.5. 
        Previous Author : None. 
        Main Author : Kwang Hyun, Shaun.(E-mail : drakan@hitel.net) 

        Comment : Sample code for callback function understanding. 
-------------------------------------------------------------------------*/ 
#include "callback.h" 


int Callback_0 (int i) 

        return i+0; 


int Callback_1 (int i) 

        return i+1; 


int Callback_2 (int i) 

        return i+2; 


void main () 

        print_integer(Callback_0,10); 
        print_integer(Callback_1,10); 
        print_integer(Callback_2,10); 


/*        File End. 
-------------------------------------------------------------------------*/ 


NOTE_2 : 

1) main에 주목해주시기 바랍니다. print_integer라는 함수가 모두 세번 호출되 
    고 있습니다. 하지만 그 결과는 모두 다르게 나옵니다. 
2) print_integer 함수에서 출력 data를 얻어내기 위해서 첫번째 parameter로 전 
    달된 CALLBACK 함수를 호출하기 때문입니다.. 
3) print_integer 함수를 직접 수정하지않고 외부로 회귀호출 되는 (왜 분할 컴 
    파일을 사용했는지 이해하셨길 바랍니다.. ^^;;) function을 수정함으로써 다 
    양한 동작을 만들어낼 수 있는 Programing Technique이 바로 Callback 개념입 
    니다. ^^;; 



4) Callback의 목적 

위의 예를 통해 볼수있듯이 출력결과를 수정하기 위해서 package.cpp 안에 정의 
되있는 함수를 전혀 손댈필요가없습니다.. 바로 이것이 Callback의 목적입니다. 
Standard Library를 Callback을 이용해서 사용자의 상황에 맞게 Customize할 수 
있도록 하는 것이 바로 Callback의 개념입니다. 

Package 형태로 지원되는 Library의 경우.. 위와 비슷한 상황에 많이 놓이게 
되겠죠.. 1) ANSI의 quick sort function이나 binary search function에서 key 
값 참조 Mechanism 이나.. 2) Windows Programing에서 특정 Window에 대한 Event 
handling function을 Windows 에 Callback으로 등록하는 것 등이 일반적인 
Callback의 사용 예라 할 수 있습니다. 



5. Epilogue 

Callback에 대해 이해가 되셨는지 모르겠군요.. 결코 어려운 개념이 아닙니다. 
상황에 맞는 function 호출을 미리 짜놓은 것입니다.. 일반적으로 Callback함수 
를 사용하는 것은 어렵지 않습니다.. Callback이 해야하는 일.. Callback으로 전 
달되는 Parameter의 의미 등에 대해서는 모두 해당 Software package의 Help에 정 
의되있기 때문이죠.. 읽어보고.. 그대로 맞춰주기만 하면됩니다.. 하지만 반대로 
Software package를 Design하는 입장에 있다면.. Callback과 관련된 모든 상항을 
정의해야하기 때문에 어렵습니다.. 가장 일반적인 예를 찾아내야하기 때문이죠.. 

그럼 이만..