logo

프로그래밍에서의 콜백

Computer Scienece · 11월 3일 · 14 min read
poster

컴퓨터 프로그래밍에서 콜백 또는 콜백 함수는 다른 코드에 인수로 전달되는 실행 가능한 코드에 대한 참조를 말한다. 이 실행은 동기식 콜백처럼 즉시 수행될 수도 있고, 비동기식 콜백처럼 나중에 수행될 수도 있다. 또한 블로킹 또는 비 블로킹이라고도 한다.

프로그래밍 언어는 다양한 방식으로 콜백을 지원하며, 대부분 서브 루틴, 람다 표현식, 블록, 함수 포인터 등으로 구현된다.

디자인

콜백에는 두 가지 유형이 있으며, 실행 시 데이터 흐름을 제어하는 방법이 다르다. 블로킹 콜백(동기식 콜백 또는 단순한 콜백이라고도 함)과 디퍼드 콜백(비동기식 콜백이라고도 함)이다. 블로킹 콜백은 함수가 반환되기 전에 호출되지만(아래 C 예제와 같이), 지연 콜백은 함수가 반환된 후에 호출될 수 있다. 지연 콜백은 I/O 작업이나 이벤트 처리 맥락에서 자주 사용되며, 인터럽트에 의해 호출되거나 다중 스레드인 경우 다른 스레드에서 호출된다. 블로킹 콜백은 그 특성상 인터럽트나 다중 스레드 없이도 작동한다. 즉, 블로킹 콜백은 일반적으로 동기화나 다른 스레드로 작업을 위임하는 데 사용되지 않는다.

콜백은 창 시스템에서 응용 프로그램을 프로그래밍하는 데 사용됩니다. 이 경우 응용 프로그램은 운영 체제가 호출하는 특정 사용자 정의 콜백 함수를 제공(참조)하고, 운영 체제는 마우스 클릭이나 키 누름과 같은 이벤트에 대한 응답으로 이 응용 프로그램 고유의 함수를 호출한다. 이 함수는 운영 체제에서 호출되지만 시스템과 동일한 권한으로 실행되어서는 안 된다. 이 문제를 해결할 수 있는 방법으로 링을 통한 보호가 있다.

구현

콜백의 형식은 프로그래밍 언어에 따라 다르다:

  • 어셈블러, C, C++, Pascal, Modula2 및 유사한 언어에서는 함수에 대한 기계 수준 포인터를 다른 (내부 또는 외부) 함수의 인수로 전달할 수 있다. 이는 대부분의 컴파일러에서 지원되며, 특별한 래퍼 라이브러리나 클래스 없이도 서로 다른 언어를 함께 사용할 수 있다는 장점이 있다. 그 예가 Windows API로, 다양한 언어와 컴파일러, 어셈블러에서 (어느 정도) 직접 접근할 수 있다.
  • C++에서는 객체가 함수 호출 조작의 고유한 구현을 제공할 수 있다. 표준 템플릿 라이브러리는 함수 포인터와 마찬가지로 다양한 다상 알고리즘의 매개변수로 이러한 객체(펑터라고 함)를 받아들인다.
  • 자바스크립트, 루아, 파이썬, 펄, PHP 등 많은 동적 언어에서는 단순히 함수 객체를 전달할 수 있다.
  • C#이나 VB.NET과 같은 CLI 언어는 타입 안전 캡슐화 참조인 "델리게이트"를 제공하여 타입이 지정된 함수 포인터를 정의한다. 이들은 콜백으로 사용할 수 있다.
  • .NET 언어에서 사용되는 이벤트와 이벤트 핸들러는 콜백을 위한 일반화된 구문을 제공한다.
  • 함수형 언어는 일반적으로 다른 함수에 콜백으로 전달되거나, 데이터로 저장되거나, 함수에서 반환되는 퍼스트 클래스 함수를 지원한다.
  • Algol68, Perl, Python, Ruby, Smalltalk, C++11 이후, C#과 VB.NET의 새로운 버전, 그리고 대부분의 함수형 언어 등 일부 언어는 다른 곳에서 정의된 함수에 대한 참조 대신 이름 없는 코드 블록(람다 표현식)을 제공할 제공할 수 있습니다.
  • Scheme, ML, JavaScript, Perl, Python, Smalltalk, PHP(5.3.0 이상), C++11 이상, Java(8 이상) 및 기타 여러 언어에서 이러한 함수를 클로저로 만들 수 있다. 그러나 자바에서는 스코프로 둘러싸인 로컬 변수를 변경할 수 없다.
  • 함수 값 인수가 없는 객체지향 프로그래밍 언어, 예를 들어 자바 버전 8 이전 버전에서는 추상 클래스나 인터페이스의 인스턴스를 전달하여 콜백을 시뮬레이션할 수 있다. 이러한 객체는 사실상 콜백 및 콜백이 조작해야 하는 데이터의 묶음이다. 이러한 객체는 Visitor, Observer, Strategy 등 다양한 디자인 패턴을 구현하는 데 유용하다.
관련 포스트