2016. 5. 18. 01:16

원본 사이트 : http://www.tutok.sk/fastgl/callback.html


* 원 제목 : Callbacks in C++ using template functors


- 도입(Introduction)

객체 지향 프로그래밍의 많은 약속 중에 하나는 재사용 가능한 컴포넌트와 함께 플러그 앤 플레이 소프트웨어 디자인을 허락하는 것이다.

디자이너는 그들의 라이브러리 덩어리로부터 객체를 땡겨올 것이고, 그것들을 가지고 소프트웨어를 함께 만들이 위해 연결할 것이다

C++에서 컴포넌트들과 함께 하는 이 연결은 난감할 수 있고 특히 만약 그것들이 별도로 디자인 되어있으면 더 난감하다

우리는 여전히 상호 작용하는 라이브러리와 응용 프로그램 컴포넌트들로부터 긴 길이 될 것이다

콜백은 독립적으로 개발된 객체들이 함께 연결될 수 있는 메커니즘을 제공한다

그것들은 플러그 앤 플래이 프로그래밍에 필수적인데, 왜냐하면 공장 B의 클래스, 또는 너의 집에서 끓인 클래스의 용어로 그들의 라이브러리를 구현하는 공장 A의 가능성은 0이기 때문이다


콜백은 널리 사용되지만 일반성의 부족으로 최소한이 현재 구현은 다르고 대부분 부족으로부터 고통을 받는다

이 글은 콜백이 무엇이고, 어떻게 그것들이 사용되고, 좋은 콜백 메커니즘에 대한 기준을 설명한다

그것은 현재의 콜백 메서드와 그것들의 약점을 요약한다.

그리고나서 그것은 템플릿 함수자(template functor)- 함수처럼 행동하는 객체-에 기반한 유연한, 파워풀한, 사용하기 쉬운 콜백 기술을 설명한다



* 콜백의 근본(Fundamentals)


- 콜백이란 무엇인가?

응용프로그램 또는 서브 시스템에 특화된 컴포넌트들을 디자인할 때 우리는 종종 어느 컴포넌트끼리 상호작용할지 클래스의 모든 것을 알고 따라서 

명시적으로 이 클래스들로 인터페이스를 코딩한다

그러나 일반적인 목적 또는 라이브러리 컴포넌트를 디자인할 때, 그것은 종종 필수적이거나 모르는 객체를 호출할 때 같이 하기 위해 넣기를 원한다

요구되는 것은 다른 컴포넌트 타임의 용어나 지식으로 쓰여지는 것에 관계 없이 서로를 호출하는 하나의 컴포넌트를 위한 방법이다

그런 '타입 블라인드' 호출 메커니즘을 종종 콜백으로 언급한다


콜백은 아마 간단한 통보, 두가지 의사소통 또는 프로세스에서 일을 분배할 때 사용된다

예를 들어 응용 프로그램 개발자가 클릭할 때 GUI 라이브러리 호출을 응용 프로그램에 특화된 객체로 Button 컴포넌트를 갖기를 원한다

데이터 진입 컴포넌트의 디자이너는 입력 유효성을 위한 응용 프로그램 객체 호출을 위한 능력을 제공하기를 원할 수도 있다

Collection 클래스들은 종종 apply() 함수를 제공하는데, 이것은 그것들이 포함하는 아이템에 대한 응용 프로그램 객체의 멤버 함수를 적용한다


그리고나서 콜백은 응용 프로그램 객체와 함께 상호작용으로 세우기 위해 개발자들이 사용할 수도 있는 일반적인 연결점을 제공하는 컴포넌트 디자이너들을 위한 방법이다

일부 연속적인 점에서 컴포넌트는 응용 프로그램 객체를 콜백한다

의사소통은 함수 호출의 형태를 갖는다 왜냐하면 이것은 C++에서 객체들이 상호작용하는 방법이기 때문이다


콜백은 많은 문맥에서 유용하다

만약 당신이 상용 클래스 라이브러리를 사용한다면 아마도 콜백을 제공하는 최소한 하나의 메커니즘을 봤을 것이다

모든 콜백 구현은 C++ 타입 시스템에 의해 제공된 근본 문제를 다루어야 한다

그러나 당신은 컴포넌트가 디자인 됐을 때 그것의 타입을 모르는 객체들의 멤버 함수들을 호출할 수 있는 컴포넌트들을 빌드할 수 있는가?

C++ 타입 시스템은 우리가 호출하기를 원하는 멤버 함수의 어떤 객체의 타입을 알기를 원하고 종종 진짜 컴포넌트 기반 디자인을 지지하는 것에 매우 유연한 다른 언어들의 팬에 의해 비판 받는다

왜냐하면 모든 컴포넌트들은 서로에 대해 알아야만 하기 때문이다

C++의 강한 타입은 많은 장점들을 금지시키지만 이 유연성의 분명한 부족함을 다루는 것은 강건하고 상호작용하는 클래스 라이브러리들의 확산을 격려할 수도 있다


C++은 사실 매우 유연하고 그 메커니즘은 언어의 확장 없이 이 기능을 제공하는 유연함의 지렛대를 여기에서 나타낸다

특히 템플릿은 이와 같은 문제를 풀기 위한 강력한 도구를 제공한다

만약 당신이 템플릿이 오직 컨테이너 클래스를 위한 것이라고 생각했다면 

이 글을 읽어라~


* 콜백 용어(Callback Terminology)


콜백 메커니즘에서 3가지 요소가 있다 

- 호출자(caller), 콜백 함수(callback function), 피호출자(callee)