안녕하세요? 환민입니다.
콜백 함수(Callback function)이란 무엇일까요? 라는 주제로 글을
써보도록 하겠습니다.
직관적으로 해석해보면, 호출한다(call) 거꾸로(back) 함수(function).
이렇게 되네요.
"거꾸로 호출되는 함수" 라는 직관적인 번역이 됩니다.
저는 이 직관적(엉터리? ;;;;) 번역으로 부터 콜백 함수의 개념을 떠올립니다.
여러분이 프로그램을 작성하고 있고, 그 프로그램 코드들이 대부분
윈도우즈의 API 함수들을 호출하는 코드들이라고 합시다.
그러면 여러분의 프로그램의 함수들에서 윈도우즈 API 함수들을
호출하는 것이 됩니다.
자신의 프로그램의 함수 -> API 함수
호출 방향이 이렇게 되지요. 거꾸로 호출한다면...?
API 함수 -> 자신의 프로그램의 함수
이렇게 됩니다.
이게 답입니다.
윈도우즈 API 함수들을 보다보면 인자로서 함수 포인터를 요구하는
것들이 있습니다. 니가 만든 함수 나한테 넘겨줘~ 내가 필요할 때
불러 쓸께... 라는 것이죠.
이렇게 호출 방향이 반대가 되므로, 콜백 함수라고 합니다.
위의 예에서는 Windows API를 예로 들었는데, 꼭 이 경우에만 쓰이는
용어가 아니라 어떤 라이브러리와 자신의 프로그램 코드 사이의
관계에서 쓰이는 용어입니다.
아래는 하이텔의 소프트웨어 동호회에서 퍼놨던 콜백 함수에 대한
좀더 체계적인 설명입니다. 약간 어렵습니다.
------------------------------------------------------------------------
번 호 : 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 형태의 Soft
ware 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과 관련된 모든 상항을
정의해야하기 때문에 어렵습니다.. 가장 일반적인 예를 찾아내야하기 때문이죠..
그럼 이만..
불패신화 from U.S.A.
|