컴퓨터/C
인터넷을 통해 콜백 함수에 대해 찾아보면 다양한 말로 엄청나게 많은 설명이 있습니다.
피호 출자가 호출자에게 요청하는 함수..
암시적 호출을 하는 함수.. 호출되는 함수..
간단하게 콜백 함수라 불리는 녀석들은 C언어에서는 함수 포인터가 매개변수로 들어가는 함수를 콜백 함수라 일컫습니다.
그럼 여러 글들에서 설명하는 것처럼 함수 포인터를 매개변수로 사용하는 함수를 왜 콜백 함수라는 이름을 만들어서 부르고 있는 건지 알 필요가 있습니다.
함수 포인터를 이용하면 똑같은 형식의 함수의 메모리 주소를 참조할 수 있게 됩니다.
그렇다면, 아래의 가정을 들어 예를 들어보도록 합시다.
위와 같은 상황에서 함수 포인터를 이용한 함수 즉 콜백 함수가 존재하지 않는다면 B의 요청에 의해 A프로그래머는 새로운 기능을 가진 함수를 만들고 배포해야 됩니다.
이 과정에서 극단적인 괴리가 생기게 됩니다.
A프로그래머는 한 명의 사용자를 위해 다시 만들고 배포를 해야 되며, B는 A가 다시 만들어 줄 때까지 하염없이 기다려야 됩니다.
이런 과정을 극복하게 해주는 녀석이 바로 콜백 함수입니다.
그럼 예제 소스를 보며 이해를 해보겠습니다.
int sum(int a, int b) {
return a + b;
}
int sum_abs(int a, int b) {
if (a < 0) a = a * -1;
if (b < 0) b = b * -1;
return a + b;
}
예제처럼 계속해서 새로운 기능을 담는 함수를 만들거나, 수정하여 배포하여야 됩니다.
하지만 콜백 함수의 개념을 도입하면 상황이 바뀌게 됩니다.
//A가 배포한 라이브러리 함수
//실제 소스코드는 B는 볼수 없음
//다만 A가 콜백을 구현 할 수 있도록 만듬
int sum(int a, int b, void (*funcp)(int*,int*)) {
if (funcp != NULL) {
funcp(&a, &b);
}
return a + b;
}
//B가 만든 사용자 정의 함수 콜백용으로 만든 함수
void userdefine(int* a, int* b) {
if (*a < 0) *a = *a * -1;
if (*b < 0) *b = *b * -1;
}
int main() {
int result = 0;
result = sum(2, -2, NULL);
printf("콜백 함수 없이 호출 한 결과 : %d \n", result);
result = sum(2, -2, userdefine);
printf("콜백 함수를 정의하여 호출 한 결과 : %d\n", result);
return 0;
}
어느 정도 이해가 되는지 모르겠습니다. 위 소스코드를 해석해보자면 다음과 같습니다.
int sum(int a, int b, void (*funcp)(int*,int*));
라며 라이브러리를 배포했습니다.
하지만 B는 두 개의 값을 절대 값으로 만들고 더하는 기능을 만들고 싶었습니다. 그래서 자기의 함수를 만들고 그 함수를 A의 라이브러리 매개변수로 이용하여 사용했습니다.
결국 B는 자신이 함수를 만들었지만 함수를 호출하지 않았습니다. 하지만 어디선가 함수가 동작했고, 원하는 결과를 얻었습니다.
다시 말하자면 A가 만든 sum이 호출되면서, 매개변수인 함수 포인터를 통해 사용자 B가 아닌 sum을 통해 B가 만든 함수가 호출되었습니다. 이런 것처럼 피호 출자가 함수를 호출하는 녀석을 콜백 함수라고 합니다.
꼭 쓰지는 않아도 됩니다. 하지만 위의 예시처럼 콜백의 기능은 A와 B처럼 양쪽에 좋은 점이 많습니다. 그러므로 많이 사용되고 있습니다.
이 말인즉슨 다른 라이브러리를 사용하는데 콜백에 대한 개념이 자리잡지 않고서는 콜백의 개념을 적용한 라이브러리를 사용하기는 쉽지 않다는 말이 됩니다.
그렇기 때문에 콜백에 대한 개념을 알아두고, 다양한 응용 프로그래밍을 하던 콜백의 개념이 나왔을 때 이해에 도움이 됐으면 합니다.
C언어 - switch 문과 지역변수 (중괄호의 필요성) (0) | 2022.04.01 |
---|---|
C 언어 - 비트연산 (0) | 2022.02.20 |
C 언어 - 함수 포인터 (0) | 2022.01.28 |
Visual Studio - Debug 와 Release (프로그램 배포) (0) | 2022.01.05 |
C 언어 - scan 무한 반복 에러 (0) | 2021.12.01 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet