[파이썬] 클로저의 개념과 활용

클로저(closure)는 프로그래밍 언어에서 고급 개념 중 하나로, 함수와 그 함수가 참조하는 비지역 변수(local variable)들의 조합입니다. 이러한 조합은 함수가 만들어진 환경을 기억하고 저장하게 해줍니다. 이러한 특성은 클로저를 활용하여 다양한 프로그래밍 패턴과 작업을 수행하는 데 매우 유용합니다.

클로저의 개념

클로저는 다음과 같은 특징을 가지고 있습니다:

  1. 함수 내부에서 함수를 정의하고, 그 내부 함수가 외부 함수의 변수를 참조할 수 있습니다.
  2. 외부 함수의 실행이 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있습니다.
  3. 내부 함수가 참조하는 외부 함수의 변수는 메모리 상에서 계속 유지됩니다.

클로저는 이러한 특성을 활용하여 함수의 실행 컨텍스트를 유지하고, 다양한 패턴과 작업을 수행할 수 있게 해줍니다.

클로저의 활용

비공개 변수 구현

클로저를 사용하면 비공개(private) 변수를 구현할 수 있습니다. 외부 함수의 변수를 내부 함수에서 참조하여, 외부에서는 접근할 수 없는 비공개 변수를 만들어낼 수 있습니다.

def counter():
    count = 0
    
    def increment():
        nonlocal count
        count += 1
        print(count)
    
    return increment

c = counter()
c()  # 출력: 1
c()  # 출력: 2

위 예제에서 counter 함수는 내부 함수 increment를 반환합니다. increment 함수는 외부 함수인 counter의 변수인 count를 참조하고, count를 1씩 증가시킨 후 print로 출력합니다. 이렇게 함으로써 외부에서는 count 변수에 직접 접근할 수 없으며, 내부 함수 increment를 통해 접근할 수 있게 됩니다.

콜백 함수 구현

클로저는 콜백(callback) 함수를 구현하는 데에도 활용될 수 있습니다. 콜백 함수란 다른 함수의 인자로 전달되어 특정 이벤트 발생 시 호출되는 함수입니다. 클로저를 사용하면 이벤트가 발생할 때마다 특정 변수의 상태를 유지하며 콜백 함수를 호출할 수 있습니다.

def event_handler():
    count = 0
    
    def callback():
        nonlocal count
        count += 1
        print(f"Event occurred! Count: {count}")
    
    return callback

handler = event_handler()
handler()  # 출력: Event occurred! Count: 1
handler()  # 출력: Event occurred! Count: 2

위 예제에서 event_handler 함수는 내부 함수 callback을 반환합니다. callback 함수는 외부 함수 event_handler의 변수인 count를 참조하고, 이벤트가 발생할 때마다 count를 1씩 증가시킨 후 메시지를 출력합니다. 이렇게 함으로써 클로저를 사용하여 이벤트를 처리하는 콜백 함수를 구현할 수 있습니다.

결론

클로저는 함수와 비지역 변수의 조합으로, 함수가 만들어진 환경을 기억하고 유지할 수 있게 해줍니다. 이러한 클로저의 특성을 활용하면 비공개 변수를 구현하거나, 콜백 함수를 구현하는 등 다양한 프로그래밍 작업을 수행할 수 있습니다. 클로저를 잘 이해하고 활용하면 더욱 효율적이고 유연한 프로그래밍을 할 수 있습니다.