[Python] 클로저(Closure)파이썬(python)2025. 1. 16. 00:29
Table of Contents
728x90
파이썬 일급 함수와 클로저 기초 이해
파이썬은 일급 함수(First-Class Function)를 지원하는 언어로, 함수를 마치 하나의 객체처럼 다룰 수 있음.
이에 따라 클로저(Closure)라는 개념도 자연스럽게 등장함.
클로저는 함수가 종료된 후에도 함수의 자유 변수(free variable)를 기억하고 사용할 수 있게 하는 강력한 기능을 제공함.
일급 함수란?
파이썬의 함수는 다음과 같은 조건을 만족하며 일급 객체로 취급됨:
- 함수를 변수에 할당할 수 있음
- 함수의 인수로 다른 함수를 전달할 수 있음
- 함수의 반환값으로 다른 함수를 반환할 수 있음
클로저(Closure)란?
클로저는 함수가 반환된 이후에도 반환 당시의 환경을 기억하고 있는 함수임. 특히, 클로저는 외부 함수의 변수와 상태를 저장하여 이후에도 이를 참조하거나 수정할 수 있음.
- 자유 변수(Free Variable): 클로저 내부 함수에서 사용되지만, 내부 함수 내에서 선언되지 않은 변수를 의미
- 클로저 조건:
- 내부 함수가 외부 함수의 변수에 접근해야 함
- 외부 함수의 실행이 끝나도 내부 함수가 반환되어 호출될 수 있어야 함
클로저 기본 예제
다음은 클로저의 기본적인 사용법을 보여주는 예제임:
def closure_ex1():
# 자유 변수 선언 (클로저 영역)
series = []
def average(v):
series.append(v)
print('inner >>> {} / {}'.format(series, len(series)))
return sum(series) / len(series)
return average
# 클로저 함수 생성
avg_closure1 = closure_ex1()
# 클로저 사용
print(avg_closure1(10)) # 10.0
print(avg_closure1(30)) # 20.0
print(avg_closure1(50)) # 30.0
결과 설명
closure_ex1
함수가 호출될 때, 내부에 정의된average
함수가 반환됨average
함수는 외부의series
라는 리스트(자유 변수)를 참조함- 반환된
average
는 호출될 때마다series
리스트에 값을 추가하고, 평균 값을 반환함 - 외부 함수는 종료되었지만, 반환된 클로저 함수는 자유 변수를 계속 기억하고 사용함
클로저 내부 구조 확인
클로저 함수의 내부를 살펴보면, 자유 변수를 어떻게 관리하고 있는지 확인 가능:
print(dir(avg_closure1)) # avg_closure1의 속성 확인
print(avg_closure1.__code__.co_freevars) # 자유 변수 확인
print(avg_closure1.__closure__[0].cell_contents) # 자유 변수의 현재 값 확인
출력 결과
co_freevars
: 클로저가 사용하는 자유 변수의 이름을 리스트로 반환 (['series']
)__closure__
: 자유 변수가 저장된 메모리 셀cell_contents
: 자유 변수의 실제 값 확인 가능
잘못된 클로저 사용
클로저를 사용할 때 주의해야 할 점도 있음. 아래는 잘못된 클로저 사용의 예제:
def closure_ex2():
cnt = 0
total = 0
def average(v):
cnt += 1 # 에러 발생: cnt가 내부에서 초기화되지 않았음
total += v
return total / cnt
return average
avg_closure2 = closure_ex2()
# print(avg_closure2(10)) # UnboundLocalError 발생
원인 분석
- 내부 함수에서
cnt
와total
변수를 수정하려고 하지만, 파이썬은 이를 지역 변수로 간주함 - 따라서 수정 시 UnboundLocalError가 발생
nonlocal
키워드를 이용한 클로저 수정
위 문제를 해결하려면, nonlocal
키워드를 사용하여 변수의 스코프를 명시적으로 지정해야 함:
def closure_ex3():
cnt = 0
total = 0
def average(v):
nonlocal cnt, total # 외부 함수의 변수를 참조하도록 선언
cnt += 1
total += v
return total / cnt
return average
avg_closure3 = closure_ex3()
print(avg_closure3(15)) # 15.0
print(avg_closure3(35)) # 25.0
print(avg_closure3(40)) # 30.0
결과 설명
nonlocal
키워드로cnt
와total
을 외부 함수의 변수로 참조하도록 선언- 내부 함수에서 자유 변수의 값을 안전하게 수정 가능
클로저의 활용 사례
- 상태 유지: 함수 호출 간의 상태를 유지하는 데 사용
- 데코레이터 구현: 동적으로 함수의 기능을 확장할 때 유용
- 캡슐화: 외부에서 접근할 수 없는 private 변수를 구현할 때 사용
정리
클로저는 파이썬의 강력한 기능 중 하나로, 함수가 종료된 이후에도 변수의 상태를 기억하고 사용할 수 있음.
올바른 클로저 사용법과 nonlocal
키워드의 활용을 이해하면 더 강력한 함수형 프로그래밍을 구현할 수 있음
'파이썬(python)' 카테고리의 다른 글
[Python] Linked List (0) | 2025.01.17 |
---|---|
[Python] 해시 테이블(Hash Table) 활용: Dict, Set (0) | 2025.01.12 |
[Python] 해시 테이블(Hash Table) (0) | 2025.01.12 |
[Python] sort, sorted (0) | 2025.01.12 |
[Python] 파이썬 namedtuple (0) | 2025.01.05 |
@mane Lab :: 마네의 연구소
배움에 즐거움을 느끼는 마네의 연구소입니다. 이미지 출처 : https://www.instagram.com/hoseobiiiiiii._.0410/
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!