번 호 : 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과 관련된 모든 상항을 정의해야하기 때문에 어렵습니다.. 가장 일반적인 예를 찾아내야하기 때문이죠.. 그럼 이만..