콜백 함수 란 무엇입니까?
콜백 함수 란 무엇입니까?
개발자는 저주받은 물건의 이름 때문에 콜백이 무엇인지 혼란스러워합니다.
콜백 함수는 다음과 같은 함수입니다.
- 다른 기능에 의해 액세스 가능
- 첫 번째 함수가 완료되면 첫 번째 함수 이후에 호출됩니다.
콜백 함수가 작동하는 방식을 상상하는 좋은 방법 은 전달되는 함수의 " 뒤에서 호출 "되는 함수 라는 것입니다.
아마도 더 나은 이름은 "call after" 함수일 것입니다.
이 구조는 이전 이벤트가 완료 될 때마다 활동이 발생하기를 원하는 비동기 동작에 매우 유용합니다.
의사 코드 :
// A function which accepts another function as an argument
// (and will automatically invoke that function when it completes - note that there is no explicit call to callbackFunction)
funct printANumber(int number, funct callbackFunction) {
printout("The number you provided is: " + number);
}
// a function which we will use in a driver function as a callback function
funct printFinishMessage() {
printout("I have finished printing numbers.");
}
// Driver method
funct event() {
printANumber(6, printFinishMessage);
}
event ()를 호출 한 경우 결과 :
The number you provided is: 6
I have finished printing numbers.
여기서 출력 순서가 중요합니다. 나중에 콜백 함수가 호출되기 때문에 "I have finished printing numbers"가 처음이 아니라 마지막에 인쇄됩니다.
콜백은 포인터 언어와 함께 사용되기 때문에 소위 불립니다. 이들 중 하나를 사용하지 않는 경우 '콜백'이라는 이름에 노력하지 마십시오. 다른 메서드에 대한 인수로 제공되는 메서드를 설명하는 이름 일 뿐이라는 점만 이해하면됩니다. 부모 메서드가 호출되고 (버튼 클릭, 타이머 틱 등과 같은 조건) 메서드 본문이 완료되면 그런 다음 콜백 함수가 호출됩니다.
일부 언어는 여러 콜백 함수 인수가 지원되는 구조를 지원하며 부모 함수가 완료되는 방식에 따라 호출됩니다 (즉, 부모 함수가 성공적으로 완료되는 이벤트에서 하나의 콜백이 호출되고 부모 함수가 특정 오류 등).
불투명 한 정의
콜백 함수는 다른 코드에 제공하는 함수로 해당 코드에서 호출 할 수 있습니다.
해석 된 예
왜 이렇게 하시겠습니까? 호출해야하는 서비스가 있다고 가정 해 보겠습니다. 서비스가 즉시 반환되면 다음과 같이됩니다.
- 불러라
- 결과를 기다립니다
- 결과가 나오면 계속
예를 들어 서비스가 factorial
기능 이라고 가정합니다 . 의 값을 원할 때를 5!
호출 factorial(5)
하면 다음 단계가 수행됩니다.
현재 실행 위치가 저장됩니다 (스택에 있지만 중요하지 않음).
실행은
factorial
때
factorial
완료, 그것은 결과를두고 어딘가에 당신은 그것을 얻을 수 있습니다실행이 원래 위치로 돌아옴 [1]
이제 factorial
엄청난 수를 제공하고 일부 슈퍼 컴퓨팅 클러스터에서 실행해야하므로 시간이 너무 오래 걸린다고 가정합니다. 결과를 반환하는 데 5 분이 걸릴 것으로 예상한다고 가정 해 보겠습니다. 다음과 같이 할 수 있습니다.
잠든 밤에 디자인을 유지하고 프로그램을 실행하여 절반의 시간 동안 화면을 응시하지 않도록합니다.
동안 다른 일을 할 수있는 프로그램을 디자인
factorial
의 일을하고
두 번째 옵션을 선택하면 콜백이 작동 할 수 있습니다.
종단 간 설계
콜백 패턴을 이용 factorial
하려면 다음과 같은 방식으로 호출 할 수 있어야합니다 .
factorial(really_big_number, what_to_do_with_the_result)
두 번째 매개 변수 인 what_to_do_with_the_result
은 반환하기 전에 결과에 대해 호출하기를 factorial
바라며에 함께 보내는 함수 factorial
입니다.
예, 이것은 factorial
콜백을 지원하기 위해 작성되어야 함을 의미합니다 .
이제 콜백에 매개 변수를 전달할 수 있기를 원한다고 가정합니다. 이제 당신은 할 수 없습니다. 당신이 그것을 부르지 않을 것이기 때문 factorial
입니다. 따라서 factorial
매개 변수를 전달할 수 있도록 작성해야하며 호출 할 때 콜백에 전달합니다. 다음과 같이 보일 수 있습니다.
factorial (number, callback, params)
{
result = number! // i can make up operators in my pseudocode
callback (result, params)
}
이제이 factorial
패턴 을 허용하므로 콜백은 다음과 같습니다.
logIt (number, logger)
{
logger.log(number)
}
그리고 당신의 전화 factorial
는
factorial(42, logIt, logger)
에서 무언가를 반환하려면 어떻게해야 logIt
합니까? 음, 당신은 할 수 없습니다. 왜냐하면 factorial
그것에주의를 기울이지 않기 때문 입니다.
글쎄, 왜 factorial
콜백이 반환하는 것을 반환 할 수 없습니까?
비 차단으로 만들기
실행이 factorial
완료 되면 콜백으로 넘겨지기 때문에 실제로는 호출자에게 아무것도 반환하지 않아야합니다. 이상적으로는 다른 스레드 / 프로세스 / 머신에서 작업을 시작하고 즉시 반환하여 계속할 수 있습니다.
factorial(param_1, param_2, ...)
{
new factorial_worker_task(param_1, param_2, ...);
return;
}
이것은 이제 "비동기 호출"입니다. 즉, 호출하면 즉시 반환되지만 실제로는 아직 작업을 수행하지 않았습니다. 따라서이를 확인하고 완료되었을 때 결과를 얻을 수있는 메커니즘이 필요하며 프로그램은 프로세스에서 더 복잡해졌습니다.
그런데이 패턴을 사용하면 factorial_worker_task
콜백을 비동기 적으로 시작하고 즉시 반환 할 수 있습니다.
그래서 당신은 무엇을합니까?
대답은 콜백 패턴 내에 머무르는 것입니다. 쓰고 싶을 때마다
a = f()
g(a)
그리고 f
대신 쓸 것, 비동기 적으로 호출 할 수있다
f(g)
여기서 g
콜백으로 전달됩니다.
이것은 근본적으로 프로그램의 흐름 토폴로지를 변경하고 익숙해지는 데 약간의 시간이 걸립니다.
프로그래밍 언어는 즉석에서 함수를 만드는 방법을 제공함으로써 많은 도움이 될 수 있습니다. 바로 위의 코드에서 함수 g
는 print (2*a+1)
. 당신의 언어가 이것을 완전히 불필요한 이름과 서명을 가진 별도의 함수로 정의 할 것을 요구한다면, 당신이이 패턴을 많이 사용한다면 당신의 삶은 불쾌해질 것입니다.
반면에 언어로 람다를 만들 수 있다면 훨씬 더 나은 상태입니다. 그런 다음 다음과 같은 내용을 작성하게됩니다.
f( func(a) { print(2*a+1); })
훨씬 더 좋습니다.
콜백을 전달하는 방법
콜백 함수를 factorial
어떻게 전달 하시겠습니까? 글쎄, 당신은 여러 방법으로 그것을 할 수 있습니다.
호출 된 함수가 동일한 프로세스에서 실행 중이면 함수 포인터를 전달할 수 있습니다.
또는
fn name --> fn ptr
프로그램에서 사전을 유지하고 싶을 수도 있습니다 .이 경우 이름을 전달할 수 있습니다.아마도 당신의 언어로 람다로 가능한 그 자리에서 함수를 정의 할 수 있습니다! 내부적으로는 일종의 객체를 생성하고 포인터를 전달하지만 그것에 대해 걱정할 필요가 없습니다.
호출하는 함수가 완전히 별도의 시스템에서 실행 중이고 HTTP와 같은 네트워크 프로토콜을 사용하여 호출 할 수 있습니다. 콜백을 HTTP 호출 가능 함수로 노출하고 해당 URL을 전달할 수 있습니다.
당신은 아이디어를 얻습니다.
최근의 콜백 증가
이 웹 시대에 우리가 호출하는 서비스는 종종 네트워크를 통해 이루어집니다. 우리는 종종 그러한 서비스를 통제 할 수 없습니다. 즉, 서비스를 작성하지 않았고, 유지 관리하지 않으며, 서비스가 제대로 작동하는지 또는 어떻게 수행되고 있는지 확인할 수 없습니다.
그러나 이러한 서비스가 응답하기를 기다리는 동안 프로그램이 차단 될 것으로 기대할 수 없습니다. 이를 인식하고 서비스 공급자는 종종 콜백 패턴을 사용하여 API를 설계합니다.
JavaScript는 람다 및 클로저와 같은 콜백을 매우 훌륭하게 지원합니다. 그리고 자바 스크립트 세계에는 브라우저와 서버 모두에서 많은 활동이 있습니다. 모바일 용으로 개발중인 JavaScript 플랫폼도 있습니다.
앞으로 나아갈수록 점점 더 많은 사람들이 비동기 코드를 작성하게 될 것이며,이를 위해서는 이러한 이해가 필수적입니다.
콜백은 한 단어입니다.
위키 백과 콜백 페이지 는이를 매우 잘 설명합니다.
wikipedia 페이지에서 인용 :
컴퓨터 프로그래밍에서 콜백은 실행 코드에 대한 참조 또는 다른 코드에 대한 인수로 전달되는 실행 코드의 일부입니다. 이를 통해 하위 레벨 소프트웨어 계층이 상위 레벨 계층에 정의 된 서브 루틴 (또는 함수)을 호출 할 수 있습니다.
평신도 응답은 사용자가 호출하지 않고 특정 이벤트가 발생한 후 또는 일부 코드가 처리 된 후 사용자 또는 브라우저에 의해 호출되는 함수라는 것입니다.
콜백 함수는 특정 조건이 충족 될 때 호출되어야하는 함수입니다. 즉시 호출되는 대신 미래의 특정 시점에서 콜백 함수가 호출됩니다.
일반적으로 비동기식으로 완료되는 작업이 시작될 때 사용됩니다 (즉, 호출 함수가 반환 된 후 얼마 동안 완료 됨).
예를 들어 웹 페이지를 요청하는 함수는 호출자가 웹 페이지 다운로드가 완료 될 때 호출 될 콜백 함수를 제공하도록 요구할 수 있습니다.
이 "콜백"전문 용어가 많은 곳에서 잘못 사용되었다고 생각합니다. 내 정의는 다음과 같습니다.
콜백 함수는 누군가에게 전달하여 특정 시점에 호출하게하는 함수입니다.
사람들이 위키 정의의 첫 문장을 읽은 것 같습니다.
콜백은 실행 코드에 대한 참조 또는 다른 코드에 대한 인수로 전달되는 실행 코드의 일부입니다.
저는 많은 API로 작업 해 왔으며 다양한 나쁜 예를 봅니다. 많은 사람들이 함수 포인터 (실행 코드에 대한 참조) 또는 익명 함수 (실행 코드 조각)를 "콜백"이라고 부르는 경향이 있습니다. 만약 그들이 단지 함수라면 왜 다른 이름이 필요합니까?
실제로 위키 정의의 두 번째 문장 만이 콜백 함수와 일반 함수의 차이점을 보여줍니다.
이를 통해 하위 레벨 소프트웨어 계층이 상위 레벨 계층에 정의 된 서브 루틴 (또는 함수)을 호출 할 수 있습니다.
따라서 차이점은 함수를 전달할 사람과 전달 된 함수가 호출되는 방식입니다. 함수를 정의하고 다른 함수에 전달하고 해당 함수 본문에서 직접 호출 한 경우 콜백이라고 부르지 마십시오. 정의에 따르면 전달 된 함수는 "하위 수준"함수에 의해 호출됩니다.
사람들이 모호한 맥락에서이 단어를 사용하는 것을 중단 할 수 있기를 바랍니다. 사람들이 더 나쁘게만 더 잘 이해하도록 도울 수는 없습니다.
콜백은 전화 시스템 측면에서 가장 쉽게 설명됩니다. 함수 호출은 전화로 누군가에게 전화를 걸어 질문하고 답변을 받고 끊는 것과 유사합니다. 콜백을 추가하면 비유가 변경되어 그녀에게 질문을 한 후 그녀가 답변을 다시 전화 할 수 있도록 이름과 번호도 제공합니다.
-Paul Jakubik, "C ++의 콜백 구현"
간단하게합시다. 콜백 기능이란?
비유와 비유의 예
비서가 있습니다. 나는 매일 그녀에게 다음과 같이 요청한다 : (i) 회사의 보내는 우편물을 우체국에 맡기고, 그녀가 그 일을 마친 후에 : (ii) 내가 그 스티커 메모 에 내가 그녀를 위해 쓴 어떤 작업이든 .
이제 스티커 메모의 작업은 무엇입니까? 작업은 매일 다릅니다.
이 특별한 날에 그녀에게 몇 가지 문서를 인쇄해야한다고 가정 해 보겠습니다. 그래서 나는 그것을 스티커 메모에 적고 그녀가 게시해야하는 발신 메일과 함께 그녀의 책상에 고정합니다.
요약하자면:
- 먼저 그녀는 우편물을 내려야하고
- 이 작업이 완료되면 즉시 일부 문서를 인쇄해야합니다.
콜백 기능은 두 번째 작업 인 문서를 인쇄하는 것입니다. 그것은 우편물이 내려진 후에 이루어지기 때문이며, 또한 그녀가 게시해야하는 우편물과 함께 그녀에게 문서를 인쇄하라는 스티커 메모가 주어지기 때문입니다.
이제 이것을 프로그래밍 어휘와 연결합시다
- 이 경우 메서드 이름은 DropOffMail입니다.
- 콜백 함수는 PrintOffDocuments입니다. PrintOffDocuments는 DropOffMail이 실행 된 후에 만 비서가이를 수행하기를 원하기 때문에 콜백 기능입니다.
- 그래서 저는 DropOffMail 메소드에 "인수"로 PrintOffDocuments를 "전달합니다. 이것은 중요한 점입니다.
그게 전부입니다. 더 이상은 없습니다. 이 정보가 해결 되었기를 바랍니다. 그렇지 않은 경우 댓글을 게시 해 주시면 최선을 다해 명확히하겠습니다.
이렇게하면 콜백이 메서드 끝에있는 return 문처럼 들립니다.
그것이 그들이 무엇인지 잘 모르겠습니다.
콜백은 실제로 다른 함수가 호출되고 완료되는 결과로 함수에 대한 호출이라고 생각합니다.
또한 콜백은 "이봐 요! 당신이 요청한 것? 내가 해봤어요-당신에게 알려줄 거라고 생각 했죠-당신에게 다시"와 같은 형태로 원래 호출을 처리하기위한 것이라고 생각합니다.
Call After 는 어리석은 이름 인 callback 보다 더 나은 이름이 될 것 입니다. 함수 내에서 조건이 충족되면 인수로받은 다른 함수 인 Call After 함수를 호출 합니다.
함수 내에서 내부 함수를 하드 코딩하는 대신 이미 작성된 Call After 함수를 인수 로 받아들이는 함수를 작성 합니다. 후 전화 상태 변화에 따라 전화를받을 수있는 인수를 수신하는 기능의 코드에 의해 감지.
콜백 이란 무엇입니까 ?
- 일반적으로 누군가가받은 전화를 돌려주는 전화 통화입니다.
- 컴퓨팅에서 콜백 은 다른 코드에 인수로 전달되는 실행 가능한 코드의 일부입니다. 함수가 작업을 마치면 (또는 어떤 이벤트가 발생했을 때) 콜백 (다시 호출하므로 이름) 함수를 호출합니다.
콜백 함수 란 무엇입니까 ?
- 콜백 함수는 작업을 완료하면 마스터에게 "콜백"하는 서번트와 같습니다.
- 콜백 함수 (의이 다른 함수를 호출 할 수 있도록 다른 함수에 전달되는 함수
otherFunction
매개 변수로)를하고, 콜백 함수 내에서 호출 (또는 실행)입니다otherFunction
.
function action(x, y, callback) {
return callback(x, y);
}
function multiplication(x, y) {
return x * y;
}
function addition(x, y) {
return x + y;
}
alert(action(10, 10, multiplication)); // output: 100
alert(action(10, 10, addition)); // output: 20
SOA에서 콜백은 플러그인 모듈이 컨테이너 / 환경에서 서비스에 액세스 할 수 있도록합니다.
비유 : 콜백. 비동기. 콜백에 대한 논 블로킹
실제 사례
콜백 함수는 기존 함수 / 메서드에 지정하는 함수로, 작업이 완료되고 추가 처리가 필요할 때 호출됩니다.
예를 들어 Javascript 또는보다 구체적으로 jQuery에서 애니메이션이 완료 될 때 호출 할 콜백 인수를 지정할 수 있습니다.
PHP에서이 preg_replace_callback()
함수를 사용하면 정규식이 일치 할 때 호출되는 함수를 제공하여 일치하는 문자열을 인수로 전달할 수 있습니다.
이미지 좀 봐 :)
주 프로그램은 콜백 함수 이름으로 라이브러리 함수 (시스템 수준 함수일 수도 있음)를 호출합니다. 이 콜백 함수는 여러 방법으로 구현 될 수 있습니다. 기본 프로그램은 요구 사항에 따라 하나의 콜백을 선택합니다.
마지막으로 라이브러리 함수는 실행 중에 콜백 함수를 호출합니다.
이 질문에 대한 간단한 대답은 콜백 함수가 함수 포인터를 통해 호출되는 함수라는 것입니다. 함수의 포인터 (주소)를 다른 함수에 인수로 전달하면 해당 포인터가 함수를 호출하는 데 사용되면 해당 포인터가 가리키는 포인터는 콜백이 수행된다고합니다.
구현의 sort(int *arraytobesorted,void (*algorithmchosen)(void))
어느 시점에서 사용할 수있는 인수로 함수 포인터를 받아 들일 수 있는 함수가 있다고 가정합니다 sort()
. 그러면 여기서 함수 포인터에 의해 주소가 지정되는 코드를 콜백 함수algorithmchosen
라고 합니다 .
장점은 다음과 같은 알고리즘을 선택할 수 있다는 것입니다.
1. algorithmchosen = bubblesort
2. algorithmchosen = heapsort
3. algorithmchosen = mergesort ...
예를 들어, 프로토 타입으로 구현되었습니다.
1. `void bubblesort(void)`
2. `void heapsort(void)`
3. `void mergesort(void)` ...
이것은 객체 지향 프로그래밍에서 다형성을 달성하는 데 사용되는 개념입니다.
“컴퓨터 프로그래밍에서 콜백은 실행 코드에 대한 참조이거나 다른 코드에 대한 인수로 전달되는 실행 코드의 일부입니다. 이를 통해 하위 레벨 소프트웨어 계층이 상위 레벨 계층에 정의 된 서브 루틴 (또는 함수)을 호출 할 수 있습니다.” -위키 백과
함수 포인터를 사용하여 C에서 콜백
C에서 콜백은 Function Pointer를 사용하여 구현됩니다. 함수 포인터-이름에서 알 수 있듯이 함수에 대한 포인터입니다.
예를 들어, int (* ptrFunc) ();
여기서 ptrFunc는 인수를 취하지 않고 정수를 반환하는 함수에 대한 포인터입니다. 괄호 안에 넣는 것을 잊지 마십시오. 그렇지 않으면 컴파일러는 ptrFunc가 아무 것도 취하지 않고 정수에 대한 포인터를 반환하는 일반 함수 이름이라고 가정합니다.
다음은 함수 포인터를 보여주는 코드입니다.
#include<stdio.h>
int func(int, int);
int main(void)
{
int result1,result2;
/* declaring a pointer to a function which takes
two int arguments and returns an integer as result */
int (*ptrFunc)(int,int);
/* assigning ptrFunc to func's address */
ptrFunc=func;
/* calling func() through explicit dereference */
result1 = (*ptrFunc)(10,20);
/* calling func() through implicit dereference */
result2 = ptrFunc(10,20);
printf("result1 = %d result2 = %d\n",result1,result2);
return 0;
}
int func(int x, int y)
{
return x+y;
}
이제 함수 포인터를 사용하여 C에서 콜백의 개념을 이해해 보겠습니다.
전체 프로그램에는 callback.c, reg_callback.h 및 reg_callback.c의 세 파일이 있습니다.
/* callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* callback function definition goes here */
void my_callback(void)
{
printf("inside my_callback\n");
}
int main(void)
{
/* initialize function pointer to
my_callback */
callback ptr_my_callback=my_callback;
printf("This is a program demonstrating function callback\n");
/* register our callback function */
register_callback(ptr_my_callback);
printf("back inside main program\n");
return 0;
}
/* reg_callback.h */
typedef void (*callback)(void);
void register_callback(callback ptr_reg_callback);
/* reg_callback.c */
#include<stdio.h>
#include"reg_callback.h"
/* registration goes here */
void register_callback(callback ptr_reg_callback)
{
printf("inside register_callback\n");
/* calling our callback function my_callback */
(*ptr_reg_callback)();
}
이 프로그램을 실행하면 출력은
이것은 메인 프로그램 내부에서 my_callback 내부 register_callback 내부의 함수 콜백을 보여주는 프로그램입니다.
상위 계층 함수는 일반 호출로 하위 계층 함수를 호출하고 콜백 메커니즘을 사용하면 하위 계층 함수가 콜백 함수에 대한 포인터를 통해 상위 계층 함수를 호출 할 수 있습니다.
인터페이스를 사용한 자바 콜백
Java는 함수 포인터 개념이 없습니다. 인터페이스 메커니즘을 통해 콜백 메커니즘을 구현합니다. 여기서 함수 포인터 대신 호출 수신자가 작업을 완료 할 때 호출 될 메소드가있는 인터페이스를 선언합니다.
예제를 통해 설명하겠습니다.
콜백 인터페이스
public interface Callback
{
public void notify(Result result);
}
발신자 또는 상위 수준 클래스
public Class Caller implements Callback
{
Callee ce = new Callee(this); //pass self to the callee
//Other functionality
//Call the Asynctask
ce.doAsynctask();
public void notify(Result result){
//Got the result after the callee has finished the task
//Can do whatever i want with the result
}
}
수신자 또는 하위 계층 기능
public Class Callee {
Callback cb;
Callee(Callback cb){
this.cb = cb;
}
doAsynctask(){
//do the long running task
//get the result
cb.notify(result);//after the task is completed, notify the caller
}
}
EventListener 패턴을 사용한 콜백
- 목록 항목
이 패턴은 0 ~ n 개의 관찰자 / 수신자에게 특정 작업이 완료되었음을 알리는 데 사용됩니다.
- 목록 항목
콜백 메커니즘과 EventListener / Observer 메커니즘의 차이점은 콜백에서는 호출 수신자가 단일 호출자에게 알림을 보내는 반면 Eventlisener / Observer에서는 호출 수신자가 해당 이벤트에 관심이있는 모든 사람에게 알릴 수 있다는 것입니다 (알림은 해당 이벤트의 다른 부분으로 이동할 수 있음). 작업을 트리거하지 않은 응용 프로그램)
예를 들어 설명하겠습니다.
이벤트 인터페이스
public interface Events {
public void clickEvent();
public void longClickEvent();
}
클래스 위젯
package com.som_itsolutions.training.java.exampleeventlistener;
import java.util.ArrayList;
import java.util.Iterator;
public class Widget implements Events{
ArrayList<OnClickEventListener> mClickEventListener = new ArrayList<OnClickEventListener>();
ArrayList<OnLongClickEventListener> mLongClickEventListener = new ArrayList<OnLongClickEventListener>();
@Override
public void clickEvent() {
// TODO Auto-generated method stub
Iterator<OnClickEventListener> it = mClickEventListener.iterator();
while(it.hasNext()){
OnClickEventListener li = it.next();
li.onClick(this);
}
}
@Override
public void longClickEvent() {
// TODO Auto-generated method stub
Iterator<OnLongClickEventListener> it = mLongClickEventListener.iterator();
while(it.hasNext()){
OnLongClickEventListener li = it.next();
li.onLongClick(this);
}
}
public interface OnClickEventListener
{
public void onClick (Widget source);
}
public interface OnLongClickEventListener
{
public void onLongClick (Widget source);
}
public void setOnClickEventListner(OnClickEventListener li){
mClickEventListener.add(li);
}
public void setOnLongClickEventListner(OnLongClickEventListener li){
mLongClickEventListener.add(li);
}
}
클래스 버튼
public class Button extends Widget{
private String mButtonText;
public Button (){
}
public String getButtonText() {
return mButtonText;
}
public void setButtonText(String buttonText) {
this.mButtonText = buttonText;
}
}
클래스 체크 박스
public class CheckBox extends Widget{
private boolean checked;
public CheckBox() {
checked = false;
}
public boolean isChecked(){
return (checked == true);
}
public void setCheck(boolean checked){
this.checked = checked;
}
}
활동 클래스
com.som_itsolutions.training.java.exampleeventlistener 패키지;
public class Activity implements Widget.OnClickEventListener
{
public Button mButton;
public CheckBox mCheckBox;
private static Activity mActivityHandler;
public static Activity getActivityHandle(){
return mActivityHandler;
}
public Activity ()
{
mActivityHandler = this;
mButton = new Button();
mButton.setOnClickEventListner(this);
mCheckBox = new CheckBox();
mCheckBox.setOnClickEventListner(this);
}
public void onClick (Widget source)
{
if(source == mButton){
mButton.setButtonText("Thank you for clicking me...");
System.out.println(((Button) mButton).getButtonText());
}
if(source == mCheckBox){
if(mCheckBox.isChecked()==false){
mCheckBox.setCheck(true);
System.out.println("The checkbox is checked...");
}
else{
mCheckBox.setCheck(false);
System.out.println("The checkbox is not checked...");
}
}
}
public void doSomeWork(Widget source){
source.clickEvent();
}
}
기타 클래스
public class OtherClass implements Widget.OnClickEventListener{
Button mButton;
public OtherClass(){
mButton = Activity.getActivityHandle().mButton;
mButton.setOnClickEventListner(this);//interested in the click event //of the button
}
@Override
public void onClick(Widget source) {
if(source == mButton){
System.out.println("Other Class has also received the event notification...");
}
}
메인 클래스
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Activity a = new Activity();
OtherClass o = new OtherClass();
a.doSomeWork(a.mButton);
a.doSomeWork(a.mCheckBox);
}
}
위의 코드에서 볼 수 있듯이 기본적으로 애플리케이션에서 발생할 수있는 모든 이벤트를 나열하는 이벤트라는 인터페이스가 있습니다. Widget 클래스는 Button, Checkbox와 같은 모든 UI 구성 요소의 기본 클래스입니다. 이러한 UI 구성 요소는 프레임 워크 코드에서 실제로 이벤트를 수신하는 개체입니다. 위젯 클래스는 이벤트 인터페이스를 구현하며 OnClickEventListener 및 OnLongClickEventListener라는 두 개의 중첩 된 인터페이스를 가지고 있습니다.
이 두 인터페이스는 Button 또는 Checkbox와 같은 위젯 파생 UI 구성 요소에서 발생할 수있는 이벤트를 수신합니다. 따라서이 예제를 Java 인터페이스를 사용하는 이전 콜백 예제와 비교하면이 두 인터페이스가 콜백 인터페이스로 작동합니다. 따라서 상위 레벨 코드 (Here Activity)는이 두 인터페이스를 구현합니다. 그리고 위젯에 이벤트가 발생할 때마다 상위 레벨 코드 (또는 여기에서 Activity라고하는 상위 레벨 코드에 구현 된 이러한 인터페이스의 메소드)가 호출됩니다.
이제 콜백과 Eventlistener 패턴의 기본적인 차이점에 대해 설명하겠습니다. 콜백을 사용하여 언급했듯이 수신자는 단일 발신자에게만 알릴 수 있습니다. 그러나 EventListener 패턴의 경우 Application의 다른 부분이나 클래스는 Button 또는 Checkbox에서 발생할 수있는 이벤트에 등록 할 수 있습니다. 이러한 종류의 클래스의 예는 OtherClass입니다. OtherClass의 코드가 보이면 Activity에 정의 된 Button에서 발생할 수있는 ClickEvent에 대한 리스너로 등록 된 것입니다. 흥미로운 부분은 Activity (Caller) 외에이 OtherClass도 Button에서 클릭 이벤트가 발생할 때마다 알림을 받는다는 것입니다.
콜백 함수는 특정 함수 나 객체에 전달하는 (참조 또는 포인터로) 함수입니다. 이 함수 또는 객체는 어떤 목적 으로든 나중에 언제든지이 함수를 다시 호출합니다.
- 작업 종료 알림
- 두 항목 간의 비교 요청 (예 : c qsort ())
- 프로세스 진행 상황보고
- 이벤트 알림
- 객체의 인스턴스화 위임
- 지역 그림 위임
...
따라서 콜백을 다른 함수 또는 작업의 끝에서 호출되는 함수로 설명하는 것은 (일반적인 사용 사례 인 경우에도) 지나치게 단순화됩니다.
콜백 함수 다른 함수에 인수로 전달하는 함수입니다.
function test_function(){
alert("Hello world");
}
setTimeout(test_function, 2000);
참고 : 위의 예에서 setTimeout 함수의 인수로 사용되는 test_function.
한 가지 중요한 사용 영역은 함수 중 하나를 핸들 (즉, 콜백)로 등록한 다음 메시지를 보내거나 일부 함수를 호출하여 작업 또는 처리를 수행하는 것입니다. 이제 처리가 완료된 후 호출 된 함수가 등록 된 함수를 호출하여 (즉, 콜백이 완료 됨) 처리가 완료되었음을 나타냅니다.
이 위키피디아 링크는 그래픽으로 아주 잘 설명합니다.
고차 함수라고도하는 콜백 함수는 매개 변수로 다른 함수에 전달되는 함수이며 콜백 함수는 상위 함수 내에서 호출 (또는 실행)됩니다.
$("#button_1").click(function() {
alert("button 1 Clicked");
});
여기에서 클릭 메소드에 대한 매개 변수로 함수를 전달했습니다. 그리고 click 메소드는 전달한 콜백 함수를 호출 (또는 실행)합니다.
콜백은 함수를 매개 변수로 다른 함수에 전달하고 프로세스가 완료되면이 함수를 호출하는 아이디어입니다.
위의 멋진 답변을 통해 콜백의 개념을 알게된다면 그 아이디어의 배경을 배우는 것이 좋습니다.
"왜 그들 (컴퓨터 과학자)이 콜백을 개발하게 되었습니까?" 차단 (특히 UI 차단) 문제를 알 수 있으며 콜백 만이 해결책이 아닙니다. 다른 많은 솔루션 (예 : Thread, Futures, Promises ...)이 있습니다.
참고 URL : https://stackoverflow.com/questions/824234/what-is-a-callback-function
'program tip' 카테고리의 다른 글
Bash 스크립트에 전달 된 인수 수 확인 (0) | 2020.10.02 |
---|---|
JavaScript가 비활성화되어 있는지 감지하는 방법은 무엇입니까? (0) | 2020.10.02 |
모든 출력을 파일로 리디렉션 (0) | 2020.09.30 |
Android 스튜디오의 "기호 R을 확인할 수 없음" (0) | 2020.09.30 |
문자열에서 스트림을 어떻게 생성합니까? (0) | 2020.09.30 |