본문 바로가기
Python

클로저와 데코레이터 요약 정리

by 좌우지간에 2024. 12. 26.

클로저와 데코레이터 요약 정리 🎨


1. 클로저 (Closure) 📦

  • 정의: 🧩 함수 내부에 정의된 내부 함수(inner function)가 외부 함수의 변수를 기억하고 접근할 수 있는 함수. 외부 함수는 내부 함수를 반환한다. 🔄

 

  • 핵심:
    • 외부 함수의 변수 값을 내부 함수에 저장하여 반환 💾
    • 마치 클래스를 이용해 특정 값으로 객체를 만드는 것과 유사 ⚙️
  • 예시:
    • 외부 함수 mulm 값을 받아 내부 함수 wrapper를 생성 및 반환 📤➡️📥
    • mul3m 값이 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`**: 다양한 형태의 입력 인수를 유연하게 처리하는 방법 🤹