ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬: 콜백함수(callback)
    Python/이것저것 파이썬 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가 나왔....

     

    반응형
Designed by Tistory.