Python
파이썬 클로저 (closure)
cclass
2021. 3. 6. 00:00
0. 클로저란
프로그래밍 언어에서 퍼스트 클래스 함수 (First class function) 를 지원하는 언어의 네임 바인딩 기술이다.
클로저는 어떤 함수를 함수 자신이 가지고 있는 환경과 함께 저장한 레코드이다
또한 함수가 가진 프리변수(free variable)를 클로저가 만들어지는 당시의 값과 래퍼런스에 맵핑하여 주는 역활을 한다.
클로저는 일반 함수와는 다르게 자신의 영역 밖에서 호출된 함수의 변수값과 레퍼런스를 복사하고 저장한 뒤, 이 캡쳐한 값들에 엑세스 할 수 있게 도와준다.
자신을 둘러싼 스코프(네임스페이스)의 상태값을 기억하는 함수라고 생각하면 될 것 같다.
1. 클로저 사용의 장점
관리와 책임을 명확히 할 수 있고 각 변수가 섞여 불필요한 충동을 방지할 수 있으며 사용환경(context) 에 맞게 임의대로 내부구조를 조정할 수 있다.
2. 함수가 클로저이기 위한 세가지 조건
- 해당 함수는 어떤 함수내의 중첩된 함수여야 한다.
- 해당 함수는 자신을 둘러싼 함수 내의 상태값을 반드시 참조해야 한다.
- 해당 함수를 둘러싼 함수는 이 함수를 반환해야 한다.
3. 클로저 이해를 위한 코드
def outer_func():
title = 'CLOSURE EXAMPLE'
total_call = 0
def inner_func(content):
nonlocal total_call
total_call += 1
print("{0} / {1} / {2} call".format(title, content, total_call))
return inner_func
var_func = outer_func()
print(var_func)
# >>> <function outer_func.<locals>.inner_func at 0x103a2bd30>
print()
var_func('STEP 1')
# >>> CLOSURE EXAMPLE / STEP 1 / 1 call
var_func('STEP 2')
# >>> CLOSURE EXAMPLE / STEP 2 / 2 call
var_func('STEP 3')
# >>> CLOSURE EXAMPLE / STEP 3 / 3 call
var_func2 = outer_func()
var_func2('STEP 4')
# >>> CLOSURE EXAMPLE / STEP 4 / 0 call