Python
클로저와 데코레이터 요약 정리
by 좌우지간에
2024. 12. 26.
클로저와 데코레이터 요약 정리 🎨
1. 클로저 (Closure) 📦
- 정의: 🧩 함수 내부에 정의된 내부 함수(inner function)가 외부 함수의 변수를 기억하고 접근할 수 있는 함수. 외부 함수는 내부 함수를 반환한다. 🔄
- 핵심:
- 외부 함수의 변수 값을 내부 함수에 저장하여 반환 💾
- 마치 클래스를 이용해 특정 값으로 객체를 만드는 것과 유사 ⚙️
- 예시:
- 외부 함수
mul은 m 값을 받아 내부 함수 wrapper를 생성 및 반환 📤➡️📥
mul3는 m 값이 3으로 고정된 클로저가 됨 🔒
mul3(n)을 호출하면 m 값 3과 n을 곱한 결과를 반환 🔢
def mul(m): # 외부 함수
def wrapper(n): # 내부 함수
return m * n
return wrapper
mul3 = mul(3) # 클로저 생성 (m = 3)
print(mul3(5)) # 15 출력 (3 * 5)
2. 데코레이터 (Decorator) ✨
- 정의: 🎁 클로저를 이용하여 기존 함수를 수정하지 않고 기능을 추가할 수 있게 해주는 함수. ➕
- 핵심:
- 클로저를 이용하여 기존 함수를 감싸는(wrapping) 형태 🧻
- 함수 실행 전/후에 특정 기능을 추가하거나 수정 ⏰
@ 기호를 사용하여 함수에 적용 🏷️
- 예시:
elapsed 함수는 다른 함수(original_func)를 입력으로 받음 📤
elapsed 내부의 wrapper 함수는 original_func의 실행시간을 측정하는 기능 추가 ⏱️
@elapsed를 사용하여 myfunc 함수를 elapsed 데코레이터로 감싸서 기능 추가 🎁➕
import time
def elapsed(original_func): # 데코레이터 함수
def wrapper(*args, **kwargs): # 내부 함수
start = time.time()
result = original_func(*args, **kwargs)
end = time.time()
print("함수 수행시간: %f 초" % (end - start))
return result
return wrapper
@elapsed # 데코레이터 적용
def myfunc(msg):
print(f"'{msg}'를 출력합니다.")
myfunc("Hello") # 데코레이터 적용된 함수 호출
3. *args 와 **kwargs 🧰
*args: 함수에 전달된 모든 위치 인수를 튜플 형태로 받음 📦
- `kwargs`**: 함수에 전달된 모든 키워드 인수를 딕셔너리 형태로 받음 🗝️
- 활용: 데코레이터처럼 입력 인수의 개수나 형태가 정해지지 않은 함수를 다룰 때 유용 🎯
핵심 내용 정리 📌
- 클로저: 함수가 함수를 반환하고, 내부 함수가 외부 함수의 변수를 기억하는 방식 🧠
- 데코레이터: 클로저를 활용해 기존 함수에 기능을 추가하는 패턴 🪄
*args, `kwargs`**: 다양한 형태의 입력 인수를 유연하게 처리하는 방법 🤹