콜백(컴퓨터 프로그래밍)

Callback (computer programming)
콜백은 보통 원래 발신자 수준으로 돌아갑니다.

컴퓨터 프로그래밍에서 콜백 또는 콜백 함수는 다른 코드의 인수로 전달되는 실행 가능 코드에 대한 참조입니다. 이 코드는 작업의 일부로 콜백 함수를 호출(실행)할 으로 예상됩니다.이 실행은 동기 콜백과 같이 즉시 수행되거나 비동기 콜백과 같이 나중에 수행될 수 있습니다.프로그래밍 언어는 다양한 방법으로 콜백을 지원하며 서브루틴, 람다 표현식, 블록 또는 함수 포인터를 사용하여 구현되는 경우가 많습니다.

디자인

콜백에는 2가지 타입이 있으며 실행 시 데이터 플로우를 제어하는 방법이 다릅니다.블럭킹 콜백(동기 콜백 또는 단순한 콜백이라고도 함)과 지연 콜백(비동기 콜백이라고도 함)입니다.블로킹 콜백은 함수가 반환되기 전에 호출되지만(다음 C 예시와 같이), 지연 콜백은 함수가 반환된 후에 호출될 수 있습니다.지연 콜백은 I/O 작업 또는 이벤트 처리 컨텍스트에서 자주 사용되며 여러 스레드의 경우 인터럽트에 의해 호출되거나 다른 스레드에 의해 호출됩니다.그 성질상 블로킹콜백은 인터럽트나 여러 스레드 없이 동작할 수 있습니다.즉, 블로킹콜백은 동기나 다른 스레드에 대한 작업 위임에 일반적으로 사용되지 않습니다.

콜백은 윈도 시스템에서 응용 프로그램을 프로그래밍하기 위해 사용됩니다.이 경우 어플리케이션은 특정 커스텀콜백 함수를 오퍼레이팅시스템에 공급(참조)합니다.이 함수는 마우스 클릭이나 키 누르기 등의 이벤트에 응답하여 이 어플리케이션 고유의 함수를 호출합니다.여기서 가장 중요한 것은 특권과 보안 관리입니다.오퍼레이팅시스템에서 함수를 호출하는 동안에는 시스템과 동일한 특권을 가지고 실행해서는 안 됩니다.이 문제의 해결책은 보호 링을 사용하는 것입니다.

실행

콜백의 형식은 프로그래밍 언어에 따라 다릅니다.

  • 어셈블리, C, C++, 파스칼, Modula2 및 이와 유사한 언어에서 함수에 대한 머신 레벨 포인터는 다른(내부 또는 외부) 함수에 대한 인수로서 전달될 수 있다.이는 대부분의 컴파일러에서 지원되며 특별한 래퍼 라이브러리나 클래스 없이 서로 다른 언어를 함께 사용할 수 있는 이점을 제공합니다.예를 들어 Windows API는 다양한 언어, 컴파일러 및 어셈블러가 직접(다소) 액세스할 수 있습니다.
  • C++를 사용하면 오브젝트는 함수 호출 조작을 독자적인 실장할 수 있습니다.Standard Template Library는 다양한 다형 알고리즘의 파라미터로서 이러한 오브젝트(함수라고 불린다)와 함수 포인터를 받아들입니다.
  • JavaScript, Lua, Python, Perl[1][2] PHP와 같은 많은 동적 언어들은 단순히 함수 객체를 통과시키는 것을 허용한다.
  • C#VB CLI 언어NET타입에 안전한 캡슐화 참조, 즉 "위임자"를 제공하여 잘 입력된 함수 포인터를 정의합니다.이것들은 콜백으로 사용할 수 있습니다.
  • 이벤트이벤트핸들러(에서 사용).NET 언어, 콜백에 대한 일반적인 구문을 제공합니다.
  • 기능 언어는 일반적으로 퍼스트 클래스 함수를 지원합니다.이 함수는 다른 함수에 콜백으로 전달되거나 데이터로 저장되거나 함수에서 반환될 수 있습니다.
  • 일부 언어(Algol 68, Perl, Python, Ruby, Smalltalk, C++11 이상)는 C#과 VB의 새로운 버전입니다.NET 및 대부분의 기능 언어는 다른 곳에서 정의된 함수에 대한 참조 대신 이름 없는 코드 블록(lambda 식)을 제공할 수 있습니다.
  • 예를 들어 Scheme, ML, JavaScript, Perl, Python, Smalltalk, PHP([3]5.3.0 이후), C++11 이후, Java(8 [4]이후) 및 기타 많은 언어에서 이러한 함수는 닫힘일 수 있습니다. 즉 함수가 정의된 컨텍스트에서 로컬로 정의된 변수에 액세스하고 수정할 수 있습니다.단, Java는 동봉된 범위의 로컬 변수를 수정할 수 없습니다.
  • 8 버전 이전의 Java와 같이 함수 값 인수가 없는 객체 지향 프로그래밍 언어에서는 수신자가 하나 이상의 메서드를 호출하는 추상 클래스 또는 인터페이스의 인스턴스를 전달함으로써 콜백을 시뮬레이션할 수 있으며, 콜 엔드는 구체적인 구현을 제공합니다.이러한 오브젝트는 효과적으로 콜백의 번들에 더해 조작에[clarification needed] 필요한 데이터입니다.방문자, 관찰자 및 전략과 같은 다양설계 패턴을 구현하는 데 유용합니다.

사용하다

C

콜백은 에러 시그널링 등 다양한 용도로 사용됩니다.유닉스 프로그램은 SIGTERM을 수신했을 때 즉시 종료하지 않기 때문에 종료가 적절하게 처리되도록 하기 위해 청소 기능을 콜백으로 등록합니다.콜백은 함수의 동작 여부를 제어하기 위해서도 사용할 수 있습니다.Xlib 에서는, 커스텀 술어를 지정해, 프로그램이 이벤트를 처리하고 싶은지를 판별할 수 있습니다.

다음 C 코드는 콜백을 사용하여2개의 번호를 표시하는 방법을 나타내고 있습니다.

#실패하다 <stdio.h> #실패하다 <stdlib.h> #실패하다 <time.h>  /* 호출 함수는 단일 콜백을 매개 변수로 받아들입니다.*/ 무효 프린트 투 넘버(인트 (*number 소스)(무효)) {     인트 밸브 1 = number 소스();     인트 밸브2 = number 소스();     인쇄물(%d 및 %d\n", 밸브 1, 밸브2); }  /* 가능한 콜백 */ 인트 오버나인(무효) {     돌아가다 (랜드()%1000) + 9001; }  /* 다른 콜백이 가능합니다.*/ 인트 삶의 의미(무효) {     돌아가다 42; }  /* 여기서는 3개의 다른 콜백을 가진 Print Two Numbers()를 호출합니다.*/ 인트 주된(무효) {     time_t t;     srand(시랜드)((서명되어 있지 않다)시간을(&t)); // 랜덤 함수의 초기화 시드     프린트 투 넘버(&랜드);     프린트 투 넘버(&오버나인);     프린트 투 넘버(&삶의 의미);     돌아가다 0; } 

출력 예:

23335 및 32078 9528 및 9231 42 및 42

이것은 콜백 함수의 출력을 단순히 호출 함수인 PrintTwoNumbers()에 전달하는 것과는 어떻게 다른지 주의해 주세요.PrintTwoNumbers는 같은 값을 두 번 인쇄하는 것이 아니라 필요한 횟수만큼 콜백을 호출합니다.이것이 콜백의 2가지 주요 장점 중 하나입니다.

또 다른 장점은 호출 함수가 원하는 파라미터를 호출 함수에 전달할 수 있다는 것입니다(위의 예에서는 표시되지 않습니다).이를 통해 올바른 정보를 숨길 수 있습니다.콜백을 호출 함수에 전달하는 코드는 함수에 전달되는 파라미터 값을 알 필요가 없습니다.반환값만 넘겼을 경우 파라미터를 [example needed]공개적으로 공개해야 합니다.

또 다른 예는 다음과 같습니다.

/* * 이것은 콜백의 사용법을 보여주는 간단한 C 프로그램입니다. * 콜백 기능은 발신 코드와 같은 파일에 있습니다. * 콜백 기능은 나중에 다음과 같이 외부 라이브러리에 넣을 수 있습니다. * 예를 들어 유연성을 높이기 위한 공유 객체. * */  #실패하다 <stdio.h> #실패하다 <문자열>h>  유형화된 구조 _MyMsg {     인트 appId;      메시지[32]; } 마이 메시지;  무효 마이펑크(마이 메시지 *메시지) {     한다면 (스트렌(메시지->메시지) > 0 )         인쇄물("앱 ID = %d\n메시지 = %s\n",메시지->appId, 메시지->메시지);     또 다른         인쇄물("앱 ID = %d\n메시지 = 메시지 없음\n",메시지->appId); }  /* * 시제품 선언 */ 무효 (*콜백)(마이 메시지 *);  인트 주된(무효) {     마이 메시지 메시지 1;     메시지 1.appId = 100;     스트럭시(메시지 1.메시지, "이것은 테스트입니다.\n");      /* * "myfunc" 함수의 주소를 함수에 할당합니다. * 포인터 "콜백"("callback = &myfunc;"이라고도 쓸 수 있음) */     콜백 = 마이펑크;      /* * 함수를 호출합니다(「*콜백」(&msg1)라고도 쓸 수 있습니다).;") */     콜백(&메시지 1);      돌아가다 0; } 

컴파일 후의 출력:

$ gcc cbtest.c $ . / a .out App Id = 100 Msg = 이것은 테스트입니다.

이러한 정보 은폐는 프로세스 또는 스레드 간 통신 시 또는 시리얼화된 통신 및 표 형식의 [clarification needed]데이터를 통해 콜백을 사용할 수 있음을 의미합니다.

C++에서는 펑터가 C의 함수 포인터 사용 외에 일반적으로 사용됩니다.

C#

C#의 심플한 콜백:

일반의 학급 클래스 1  {     정적인 무효 주된(스트링[] args)     {         클래스 2 c2 = 신규 클래스 2();                  /* * 콜백 방식을 파라미터로 하는 Class2의 콜 방식 */         c2.방법(콜백 방식);     }      /* * 콜백 방식.이 메서드는 콜백으로 전송된 문자열을 인쇄합니다. */     정적인 무효 콜백 방식(스트링 스트레이트)     {         콘솔.기입선($"콜백: {str}");     } }  일반의 학급 클래스 2 {     /* * 가 발신자에게 콜백하는 메서드.매개 변수로 액션(메서드)을 수행합니다. */     일반의 무효 방법(액션.< >스트링> 콜백)     {         /* * 지정된 메시지를 사용하여 Class1 메서드 CallBackMet으로 콜백합니다. */         콜백("다시 보낼 메시지");     } } 

자바스크립트

콜백은 js-ctype을 통한 콜백으로서의[5] JavaScript 함수 지원 및 addEventListener [6]등의 컴포넌트 지원을 포함한 JavaScript 의 언어 구현에 사용됩니다.단, 콜백의 네이티브 예는 복잡한 코드 없이 기술할 수 있습니다.

기능. 계산한다.(숫자 1, 숫자 2, 콜백기능.) {     돌아가다 콜백기능.(숫자 1, 숫자 2); }  기능. 계산제품(숫자 1, 숫자 2) {     돌아가다 숫자 1 * 숫자 2; }  기능. 계산 합계(숫자 1, 숫자 2) {     돌아가다 숫자 1 + 숫자 2; } // 경보 75, 5와 15의 곱 경계.(계산한다.(5, 15, 계산제품)); // 경보 20, 5와 15의 합계 경계.(계산한다.(5, 15, 계산 합계)); 

첫 번째 기능calculate는 콜백용 파라미터로 정의됩니다.callback기능.그런 다음 계산하기 위한 콜백으로 사용할 수 있는 함수 calcProduct가 정의됩니다.콜백에는 다른 함수를 사용할 수 있습니다.calcSum과 같은 함수입니다.이 예에서는 calculate()가 2회 호출됩니다.하나는 calcProduct를 콜백으로 사용하고 이제1개는 calcSum을 사용합니다.함수는 각각 곱과 합계를 반환하고 경고는 이를 화면에 표시합니다.

이 원시적인 예에서 콜백의 사용은 주로 원칙의 예시입니다.콜백을 일반 함수인 calcProduct(num1, num2)로 호출할 수 있습니다.일반적으로 콜백은 비동기 JavaScript(타이머에 근거한) 또는 XMLHtpRequest 요구와 같이 함수가 콜백을 실행하기 전에 이벤트를 실행해야 하는 경우 또는 함수에 의미 있는 반환값이 없을 때 사용됩니다.유용한 는 jQuery 등의 JavaScript 라이브러리에서 찾을 수 있습니다.jQuery에서는 .each() 메서드가 어레이와 같은 오브젝트에 대해 반복됩니다.첫 번째 인수는 각 반복에서 실행되는 콜백입니다.

빨간색 및 REBOL

의 JavaScript에서 REBOL 또는 Red(프로그래밍 언어)로 동일한 기능을 구현하는 방법을 보여 줍니다.데이터를 코드로 보다 깔끔하게 표현해 주세요.

  • 각 함수의 코드가 블록의 마지막 줄이기 때문에 반환이 암시됩니다.
  • 경고에는 문자열이 필요하므로 폼은 계산 결과에서 문자열을 생성합니다.
  • get-word! 값(예::calc-product 및 :calc-sum)은 인터프리터가 함수로 평가하는 대신 함수의 코드를 반환하도록 트리거합니다.
  • 블록의 데이터형! 참조![syslog! integer !]는 인수로 전달되는 값의 유형을 제한합니다.
빨간색 [제목: "콜백 예시"]  계산: 기능하다 [     숫자 1 [번호!]      숫자 2 [번호!]      콜백 함수 [기능!] ][     콜백 함수 숫자 1 숫자 2 ]  계산 제품: 기능하다 [     숫자 1 [번호!]      숫자 2 [번호!] ][     숫자 1 * 숫자 2 ]  계산 합계: 기능하다 [     숫자 1 [번호!]      숫자 2 [번호!] ][     숫자 1 + 숫자 2 ]  ; 경보 75, 5와 15의 곱 경계. 형태 계산한다. 5 15 : 제품명  ; 경보 20, 5와 15의 합계 경계. 형태 계산한다. 5 15 : sum(합계) 

루아

옵션의 .done 콜백을 실행하는 Roblox 엔진을 사용한 색상 조정 예:

잠깐만요.(1) 현지의 DT = 잠깐만요.()  기능. 트윈_컬러(물건, finish_color(마침_색상), 페이드 타임)   현지의 스텝_r = finish_color(마침_색상).r - 물건.배경색 3.r   현지의 스텝_g = finish_color(마침_색상).g - 물건.배경색 3.g   현지의 스텝_b = finish_color(마침_색상).b - 물건.배경색 3.b   현지의 total_steps = 1/(DT*(1/페이드 타임))   현지의 완료된;   코루틴싼다(기능.()     위해서 i = 0, 1, DT*(1 / 페이드 타임) 하다       물건.배경색 3 = 색상 3.신규 (         물건.배경색 3.r + (스텝_r/total_steps),         물건.배경색 3.g + (스텝_g/total_steps),         물건.배경색 3.b + (스텝_b/total_steps)       )       잠깐만요.()     끝.     한다면 완료된 그리고나서       완료된()     끝.   끝.)()   돌아가다 {     다 했어요. = 기능.(콜백)       완료된 = 콜백     끝.   } 끝.  트윈_컬러(some_object(개체), 색상 3.신규(1, 0, 0), 1).다 했어요.(기능.()   인쇄물 "색조 조정 완료!" 끝.) 

파이썬

Python(및 기타 언어)에서 콜백을 사용하는 일반적인 방법은 UI 요소에 이벤트를 할당하는 것입니다.

다음은 Python에서 콜백을 사용하는 매우 간단한 예입니다.먼저 콜백과 발신자 코드라는2개의 함수를 정의하고 다음으로 콜백 함수를 발신자 코드에 전달합니다.

>>>방어하다 get_square의(): ...    콜백.""" ...    돌아가다  ** 2 ... >>>방어하다 발신자(기능하다, ): ...    돌아가다 기능하다() ... >>>발신자(get_square의, 5) 25 

줄리아.

Julia의 기능은 1등급 시민이기 때문에 단순히 상위 수준의 기능에 전달되어 해당 기능 본문 내에서 사용(호출)될 수 있습니다.

위의 Julia의 예를 다음에 나타냅니다.

줄리아> get_square의()  = ^2 # 콜백 get_square (1가지 방법으로 함수 표시) 줄리아> 발신자(기능하다,) = 기능하다() caller (1개의 메서드로 기능) 줄리아> 발신자(get_square의,5) 25 

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Perl Cookbook - 11.4. Taking References to Functions". Retrieved 2008-03-03.
  2. ^ "Advanced Perl Programming - 4.2 Using Subroutine References". Retrieved 2008-03-03.
  3. ^ "PHP Language Reference - Anonymous functions". Retrieved 2011-06-08.
  4. ^ "What's New in JDK 8". oracle.com.
  5. ^ Holley, Bobby; Shepherd, Eric (eds.). "Declaring and Using Callbacks". Docs. Mozilla Developer Network (Documentation page). Archived from the original on 2019-01-17. Retrieved 2021-12-16.
  6. ^ "Creating JavaScript callbacks in components". Archive. UDN Web Docs (Documentation page). sec. JavaScript functions as callbacks. Archived from the original on 2021-12-16. Retrieved 2021-12-16.

외부 링크