파이썬 Python Decorators(데코레이터) 쉽게 이해하기

"코드를 수정하지 않고 기능을 추가할 수 있다면 얼마나 좋을까요?"

파이썬에서는 데코레이터(Decorator)라는 기능을 통해
함수나 메서드에 손쉽게 새로운 동작을 덧붙일 수 있습니다.

처음 보면 다소 낯설 수 있지만,
원리를 이해하면 굉장히 유용하게 사용할 수 있습니다.

오늘은
✔ 데코레이터의 기본 개념
✔ 간단한 데코레이터 만들기
✔ 인자 있는 함수에 데코레이터 적용하기
✔ 데코레이터 실전 예시
까지 차분히 설명해드리겠습니다.


파이썬 데코레이터 쉽게 이해하기

1. 데코레이터란 무엇인가?

데코레이터는 "함수를 꾸며주는 함수"입니다.
기존 함수를 수정하지 않고, 기능을 추가하거나 수정할 수 있습니다.

기본 개념:

@데코레이터_함수
def 원래_함수():
    pass
 

@데코레이터_함수 구문은
원래_함수 = 데코레이터_함수(원래_함수)
와 같은 의미입니다.


2. 가장 간단한 데코레이터 만들기

간단한 예제를 통해 데코레이터의 구조를 살펴봅시다.

예시

def my_decorator(func):
    def wrapper():
        print("함수 실행 전 작업")
        func()
        print("함수 실행 후 작업")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
 

실행 결과

 
함수 실행 전 작업
Hello!
함수 실행 후 작업

 

  • my_decorator는 say_hello를 감싸고, 실행 전후에 추가 작업을 합니다.

3. 인자 있는 함수에 데코레이터 적용하기

함수에 인자가 있을 때도 데코레이터를 적용할 수 있습니다.
이 경우 *args, **kwargs를 사용하면 어떤 함수에도 대응할 수 있습니다.

예시

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("함수 호출 전")
        result = func(*args, **kwargs)
        print("함수 호출 후")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")
 

실행 결과

 
함수 호출 전
Hello, Alice!
함수 호출 후

 


4. 데코레이터 실전 예시 – 실행 시간 측정

데코레이터는 실전에서도 매우 자주 사용됩니다.
예를 들어, 함수 실행 시간을 측정하는 데코레이터를 만들어볼 수 있습니다.

예시

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"실행 시간: {end_time - start_time:.4f}초")
        return result
    return wrapper

@timer
def slow_function():
    time.sleep(2)
    print("느린 함수 완료")

slow_function()
 

실행 결과

 
느린 함수 완료
실행 시간: 2.00초
 

이처럼 데코레이터를 사용하면,
핵심 로직을 변경하지 않고도 다양한 부가 기능을 추가할 수 있습니다.


결론 – 데코레이터를 이해하면

  • 코드 재사용성과 가독성이 향상됩니다.
  • 로깅, 접근 제어, 실행 시간 측정 등 다양한 상황에 적용할 수 있습니다.
  • 복잡한 기능도 깔끔하게 추가할 수 있어 코드 품질이 높아집니다.

처음에는 간단한 예제부터 따라 해보고,
점차 여러 인자나 다양한 상황에 맞춘 데코레이터를 작성해보세요.