callback (콜백 함수)

hur-kyuh-leez·2019년 10월 22일
1

좋은 설명 찾음:
https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced

근데 사실...개인적인 생각은...
function안에 원하는 걸 실행하고 다음줄에 다른 function을 넣으니 당연히
원하는 거 실행하고 다음에 다른 function이 실행되는 건... 당연하다...
왜 새로운 용어를 만든지 모르겠음..;;

왜 씀?

순차적으로 프로그램이 실행되면 좋겠지만...
그러지 않을 경우에 씁니다.
물론 코드는 위에서 아래로 실행됩니다.
하지만 실행하고 코더가 의미한 임무를 완벽히 수행한 후 다음 라인으로 넘어가면 좋겠지만
그렇지 않는 경우가 있습니다.
예) api를 쓰는 경우, 웹에서 데이터를 요청 하는 경우 ... 등등
이런 경우에는 다른 곳에서 데이터를 받는 대기시간 고려하기 위해서 콜백을 씁니다.

asynchronous를 비유를 하자면...
레스토랑에서 웨이터가 한테이블을 담당하는게 아니라
여러 테이블을 담당하게 합니다.
만약 웨이터가 한테이블만 담당을 한다면...
매우 비효율적이겠죠?
음식을 오더하고 음식이 조리되는 동안
웨이터는 띵까 띵까 놀게 됩니다.
이런걸 방지하는게
한 웨이터가 여러 테이블을 담당하는 것 이죠.
물론 그 와중에는 손님이 기다려야 하는 시간이 생깁니다.
그래서 손님이 대기하는 시간을 고려하는게 콜백함수라고 생각하면 됩니다.

나만의 정의

함수인데 다른 함수에서 input으로 받게 되면 그게 콜백 함수

예제

def callback_a(i, result):
    print("Items processed: {}. Running result: {}.".format(i, result))

def square(i):
    return i * i

def processor(process, times, report_interval, callback):
    print("Entered processor(): times = {}, report_interval = {}, callback = {}".format(
    times, report_interval, callback.func_name))
    # Can also use callback.__name__ instead of callback.func_name in line above.
    result = 0
    print("Processing data ...")
    for i in range(1, times + 1):
        result += process(i)
        sleep(1)
        if i % report_interval == 0:
            # This is the call to the callback function 
            # that was passed to this function.
            callback(i, result)

processor(square, 20, 5, callback_a)

실행화면

$ python callback_demo.py

Entered processor(): times = 20, report_interval = 5, callback = callback_a

Processing data ...

Items processed: 5. Running result: 55.

Items processed: 10. Running result: 385.

Items processed: 15. Running result: 1240.

Items processed: 20. Running result: 2870.

출처:http://code.activestate.com/recipes/580787-implementing-function-based-callbacks-in-python/

profile
벨로그에 생각을 임시로 저장합니다. 틀린건 틀렸다고 해주세요 :) 그래야 논리 학습이 강화됩니다.

0개의 댓글