클로저(closure)는 「외부 함수의 변수를 "기억하는" 내부 함수」입니다.
파이썬의 함수는 일급 객체라 다른 함수에서 반환될 수 있고, 그때 「자기가 만들어진 환경의 변수」를 함께 가지고 가는 특성입니다.
기본 예시.
def make_multiplier(factor): def multiply(x): return x * factor; return multiply.
double = make_multiplier(2).
triple = make_multiplier(3).
double(5) — 10.
triple(5) — 15.
multiply 함수는 자기를 만든 make_multiplier의 factor를 「기억」해 두었다가 호출 때마다 사용합니다.
클로저의 매력은 「상태를 가진 함수」를 만들 수 있다는 점입니다.
클래스로 인스턴스 변수를 만드는 것보다 가벼운 표현입니다.
데코레이터의 작동 원리도 클로저입니다 — 데코레이터의 wrapper 함수가 원본 func를 기억해 두는 것이 클로저.
비유하자면 클로저는 「가족 사진을 챙겨 가는 여행자」와 같습니다.
만들어질 때의 환경(외부 함수의 변수)을 사진처럼 챙겨 다니며, 어디로 가든 그 정보를 활용할 수 있습니다.
주의점: 외부 변수를 「수정」하려면 nonlocal 키워드가 필요합니다.
def counter(): count = 0; def increment(): nonlocal count; count += 1; return count; return increment.
nonlocal 없이 count += 1을 쓰면 새 지역 변수로 인식되어 오류가 납니다.
「읽기는 자동, 쓰기는 nonlocal 명시」가 클로저의 기본 규칙입니다.
한 줄 요약
클로저는 외부 함수의 변수를 기억하는 내부 함수로, 데코레이터·상태 가진 함수의 토대입니다.
외부 변수를 수정하려면 nonlocal 키워드가 필요합니다.
더 알아볼 것
- nonlocal vs global
- 함수형 프로그래밍의 클로저
- 클래스 vs 클로저 — 언제 무엇을