티스토리 뷰

콜백함수Callback 함수라는 이름자체 때문에 많은 사람들이 헷갈려 하는 부분이 있습니다. 그래서 이번 글에서는 이러한 헷갈림을 없애기 위해서 콜백함수에 대해서 설명을 드리고자 합니다. 


일반적인 개발에는 개발자가 시스템이 필요한 시점에 어떠한 특정 기능을 호출하는 방식으로 많이 사용됩니다. API를 제공받아 이 API를 시점에 맞게 호출하는 것이지요. 이는 일반적인 프로그래밍 개발 방법입니다.


하지만 이러한 함수의 호출을 시스템에 맞겨야 하는 상황이 발생하기도 합니다. 사용자가 호출 시점을 결정하는 것이 아닌 시스템 입장에서 필요한 타이밍에 호출이 필요한 상황인것이죠. 예를 들어보겠습니다. 특정 이벤트가 발생할 때 이를 사용자에게 알려준다고 가정을 해볼께요.


특정 이벤트가 발생하기 전에는 프로그램 입장에서 이벤트의 정보를 사용자에게 알려줄 수도 없습니다. 그렇다고 개발자가 개발시에 사용자에게 알려줄 이벤트가 언제 발생할지도 모르죠. 이런 경우 이벤트 발생시 데이터를 전달하게 끔 Callback을 이용하여 구현을 해놓는 겁니다. 


이 함수는 다른 함수의 매개변수로 호출될 함수를 전달하고, 특정 이벤트가 발생하고 나서 매개변수로 호출된 함수가 다시 호출되는 것을 의미합니다. 


일반적인 프로그래밍에서 함수를 호출하는 방식은 호출자가 피호출자를 호출하게 되고, 콜백함수의 경우 피호출자가 호출자를 되게 되는 거죠. 


Callback Function(콜백 함수)의 정의를 좀 더 살펴보도록 할까요. 

위키피디아에서는 콜백함수는 아래와 같이 정의해놓고 있습니다. 



프로그래밍에서 콜백(callback)은 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.


일반적으로 콜백수신 코드로 콜백 코드(함수)를 전달할 때는 콜백 함수의 포인터 (핸들), 서브루틴 또는 람다함수의 형태로 넘겨준다. 콜백수신 코드는 실행하는 동안에 넘겨받은 콜백 코드를 필요에 따라 호출하고 다른 작업을 실행하는 경우도 있다. 다른 방식으로는 콜백수신 코드는 넘겨받은 콜백 함수를 '핸들러'로서 등록하고, 콜백수신 함수의 동작 중 어떠한 반응의 일부로서 나중에 호출할 때 사용할 수도 있다 (비동기 콜백). 콜백은 폴리모피즘과 제네릭프로그래밍의 단순화된 대체 수법이며, 콜백 수신 함수의 정확한 동작은 콜백 함수에 의해 바뀐다. 콜백은 코드 재사용을 할 때 유용하다.


<참조 : 위키피디아>


그럼 Callback 함수의 예를 한번 살펴볼까요.

NI제품중에서 Text언어를 가장 많이 사용하는 DAQ 코드를 통해서 살펴보겠습니다. DAQ 예제 중에서 연속 측정에 대한 예제를 보게 되면 Callback 함수가 적용이 되어 있는것을 확인할 수 있습니다.


이는 DAQ 측정을 할 때, 수집에 필요한 정보를 DAQmxCfgSampleclkTiming에 설정을 합니다. 1초에 1000개의 포인트를 수집하고, 100개가 수집이 되면 DAQmxRegisterEveryNSamplesEvent를 통해서 EveryCallback를 호출하라 라는 의미로 구현이 된 코드입니다.



사용자가 설정한 갯수만큼 데이터가 수집이 되면 내부적으로 이벤트가 발생을 하여 EveryNCallback 함수가 호출이 됩니다. 호출이 되면 코드상에서 수집된 데이터를 Read하는 함수를 호출하여 저장된 데이터를 배열로 빼내오게 됩니다. 



즉, 사용자는 호출된 함수만 설정을 하고 시스템이 호출해야 하는 타이밍에 설정된 함수를 호출하게 되는 겁니다.


이 글에서는 간략히 콜백함수에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?



댓글