파이썬 클로저(Closure)란? 간단한 예제와 활용법

안녕하세요. 잘산다 코딩입니다. 오늘은 파이썬 클로저에 대해 알아보겠습니다. 파이썬 클로저는 함수를 둘러싼 환경을 유지하고, 나중에 다시 사용할 수 있는 함수를 말합니다. 파이썬 클로저는 어떻게 만들고 사용하는지, 그리고 어떤 장점이 있는지 알아보겠습니다.

파이썬 클로저란?
파이썬 클로저는 다음과 같은 조건을 만족하는 함수입니다.
- 외부 함수에서 내부 함수를 정의하고 반환한다.
- 내부 함수에서 외부 함수의 지역 변수를 사용한다.
- 외부 함수의 실행이 끝나도 내부 함수에서 사용한 지역 변수가 사라지지 않는다.
예를 들어, 다음과 같은 함수가 있습니다.
1 2 3 4 5 6 |
def outer_func(): a = 3 b = 5 def inner_func(x): return a * x + b return inner_func |
이 함수는 외부 함수 outer_func
에서 내부 함수 inner_func
를 정의하고 반환합니다. 내부 함수 inner_func
는 외부 함수의 지역 변수 a
와 b
를 사용하여 a * x + b
라는 계산식을 반환합니다. 이때, x
는 내부 함수의 매개변수이므로 지역 변수이고, a
와 b
는 내부 함수에서 정의되지 않은 변수이므로 자유 변수(free variable)라고 부릅니다.
이제 외부 함수를 호출하고 반환값을 변수에 저장해보겠습니다.
1 |
c = outer_func() |
이렇게 하면 c
에는 inner_func
함수 객체가 저장됩니다. 그리고 c
에 숫자를 넣어서 호출해보면 a * x + b
계산식에 따라 값이 출력됩니다.
1 2 3 |
print(c(1)) # 8 print(c(2)) # 11 print(c(3)) # 14 |
여기서 주목할 점은 외부 함수 outer_func
의 실행이 끝났음에도 불구하고, 내부 함수 inner_func
에서 사용한 지역 변수 a
와 b
가 사라지지 않고 계속 유지된다는 것입니다. 이렇게 함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 유지하다가, 함수를 호출할 때 다시 꺼내서 사용하는 함수를 클로저라고 합니다. 여기서는 c
에 저장된 함수가 클로저입니다.
파이썬 클로저의 특징
- 클로저는 함수의 반환값으로 함수를 사용할 수 있게 해줍니다. 즉, 함수를 일급 객체(first-class object)로 다룰 수 있습니다.
- 클로저는 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용할 수 있습니다. 이렇게 하면 전역 변수를 줄일 수 있고, 코드의 가독성과 유지 보수성을 높일 수 있습니다.
- 클로저에 속한 지역 변수는 외부에서 직접 접근할 수 없으므로 데이터를 숨기고 싶을 때 활용할 수 있습니다. 또한, 클로저의 지역 변수는 nonlocal 키워드를 사용하여 변경할 수 있습니다.
파이썬 클로저의 활용
파이썬 클로저는 다양한 상황에서 활용할 수 있습니다.
1 2 3 4 5 6 7 |
def countdown(n): i = n + 1 def count(): nonlocal i i -= 1 return i return count |
위 함수는 외부 함수 countdown
에서 내부 함수 count
를 정의하고 반환합니다. 내부 함수 count
는 외부 함수의 지역 변수 i
를 사용하여 i
에서 1을 뺀 값을 반환합니다. 이때, i
는 내부 함수에서 변경되므로 nonlocal 키워드를 사용합니다.
이제 외부 함수를 호출하고 반환값을 변수에 저장해보겠습니다.
1 2 |
n = int(input('Countdown from: ')) # 카운트다운할 숫자 입력 c = countdown(n) # n을 외부 함수의 매개변수로 넣어서 클로저 생성 |
이렇게 하면 c
에는 count
함수 객체가 저장됩니다. 그리고 c
를 반복해서 호출해보면 n
부터 1씩 감소하는 값을 출력합니다.
1 2 |
for i in range(n): print(c(), end=' ') |
실행 결과
1 2 |
Countdown from: 5 4 3 2 1 0 |
이렇게 파이썬 클로저를 사용하면 카운트다운 기능을 구현할 수 있습니다. 이외에도 클로저는 데코레이터(decorator), 지연 평가(lazy evaluation), 커링(currying) 등에 활용됩니다.
마무리
이번 포스트에서는 파이썬 클로저에 대해 알아보았습니다. 파이썬 클로저는 함수를 둘러싼 환경을 유지하고, 나중에 다시 사용할 수 있는 함수입니다. 파이썬 클로저는 함수의 반환값으로 함수를 사용하고, 지역 변수와 코드를 묶어서 사용하고, 데이터를 숨기는 등의 장점이 있습니다. 이 외에 데코레이터는 클로저를 활용한 파이썬의 강력한 기능 중 하나인데 이미 데코레이터에 대해 설명한 글이 있으니 궁금하시다면 방문해주세요.
데코레이터 이외에 다른 유용한 코딩 정보가 궁금하시다면 블로그 메인을 방문해주세요. 감사합니다.