Python/이것저것 파이썬

파이썬: 콜백함수(callback)

컴닥 2023. 10. 23. 07:00
반응형

함수(function)는 일등 시민(first-class citizen)

파이썬에서 함수는 일등 시민이다. 

https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B8%89_%EA%B0%9D%EC%B2%B4

디테일한 것은 위키의 해당항목을 참고하면 된다. 

일급 객체(first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.

여기서 함수를 다른 함수에 인자로 넘길 수 있다는 점에 주목하자. 
다음과 같은 것이 가능하다. 

* 함수명 뒤에 '()'를 붙이면 실행되고, 전달할 때는 함수명만 사용한다는 것에 주의한다. 

def say_hello():
    print('hello')


def say_world():
    print('world')


def test(function):
    function()


test(say_hello)
test(say_world)

함수를 인자로 넘기는 이유를 생각해 보자.
대부분은 그 함수를 '실행'하기 위해서일 것이다. 

그런데 왜 이게 필요할까? 

 

GUI에서 콜백의 사용

다음 코드를 보자. 

# 1씩 증가하는 카운터

import tkinter

counter = 0


def add():
    global counter
    counter += 1
    label.config(text=str(counter))


root = tkinter.Tk()

label = tkinter.Label(root, text=str(counter))
label.pack()

button = tkinter.Button(root, text='증가', width=15, command=add)
button.pack()

root.mainloop()
tkinter.Button(root, text='증가', width=15, command=add)

에서 command 인자로 add라는 함수명이 전달된 것을 볼 수 있다. 

어떤 버튼을 눌렀을 때 어떤 동작(함수의 실행)을 한다는 것은 매우 직관적이며 자연스럽다. 
(button이라는 버튼을 눌렀을 때 add라는 동작을 한다.)

GUI에서 버튼의 동작을 정의할 때 콜백을 많이 쓴다..
(가장 흔하고 쉬운 예)

* 이 때 람다 표현식이 유용하다는 것도 참고..
https://comdoc.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%9E%8C%EB%8B%A4-%ED%91%9C%ED%98%84%EC%8B%9D 

 

비동기에서 콜백

또 비동기 프로그래밍 이라고 해서 여러 함수를 루프를 이용해 동시에 실행시켜 결과를 도출하는 프로그래밍 기법이 있다. 

https://www.yalco.kr/21_async/

이때 동기에서는 한 줄 한 줄 순차적으로 실행되는 게 당연한데...
그 당연한 것이 비동기에서는 안된다(안될 수도 있다)... -0- 

비동기에서는 순차적으로 실행을 보장하려면...
함수의 마지막에 다음으로 실행할 함수를 넣어주어야 한다. 

다음에 실행할 함수를 하드코딩하지 않으려면 인수로 받아 마지막에 실행해야 하는 것... 
마지막(back)에 실행(call)한다고 해서 callback이라는 말이 유래한다는 데 믿거나 말거나...  

https://ko.wikipedia.org/wiki/%EC%BD%9C%EB%B0%B1

이렇게 코딩하면 콜백 지옥이 ㅠ,.ㅠ 

그래서 async await가 나왔....

 

반응형