파이썬/Basic

Python의 데코레이터: 강력한 코드 확장 기능

코샵 2024. 9. 15. 15:51
반응형

Python에서 데코레이터는 매우 강력한 기능입니다. 데코레이터를 사용하면 함수 및 클래스의 동작을 손쉽게 확장할 수 있습니다. 이번 포스팅에서는 Python 데코레이터에 대해 자세히 살펴보겠습니다.

데코레이터란?

데코레이터는 함수 또는 클래스를 수정하거나 확장하는 방법입니다. 데코레이터는 함수 앞에 @ 기호와 함께 사용됩니다.

예를 들어, 다음과 같이 @uppercase 데코레이터를 정의할 수 있습니다:

def uppercase(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

@uppercase
def say_hello(name):
    return f"hello, {name}"

print(say_hello("alice"))  # HELLO, ALICE

이 예제에서 uppercase 함수는 데코레이터 역할을 합니다. say_hello 함수 앞에 @uppercase를 붙임으로써 say_hello 함수의 동작을 변경할 수 있습니다.

데코레이터의 작동 원리

데코레이터는 함수를 인자로 받아 새로운 함수를 반환합니다. 이 새로운 함수는 원래 함수의 동작을 수정하거나 확장할 수 있습니다.

데코레이터가 호출되면 다음과 같은 과정이 진행됩니다:

  1. 데코레이터 함수가 호출되어 새로운 함수 객체를 반환합니다.
  2. 새로운 함수 객체가 원래 함수 객체를 대체합니다.
  3. 새로운 함수 객체가 호출될 때마다 데코레이터 내부의 동작이 실행됩니다.

이러한 과정을 통해 데코레이터는 함수의 동작을 수정할 수 있습니다.

데코레이터의 활용 사례

데코레이터는 다양한 용도로 사용될 수 있습니다. 대표적인 활용 사례는 다음과 같습니다:

  1. 로깅 및 디버깅: 함수 호출 시간, 입출력 값 등을 기록하는 데 사용할 수 있습니다.
  2. 인증 및 권한 검사: 사용자 인증이나 권한 검사 로직을 데코레이터로 구현할 수 있습니다.
  3. 캐싱: 함수 호출 결과를 캐싱하여 성능을 향상시킬 수 있습니다.
  4. 입력 검증: 함수 인수의 유효성을 검사하는 데 사용할 수 있습니다.
  5. 에러 처리: 함수 실행 중 발생한 예외를 처리하는 데 사용할 수 있습니다.

이 외에도 데코레이터는 함수의 동작을 다양하게 확장할 수 있는 도구입니다.

데코레이터의 응용

데코레이터는 더 복잡한 형태로도 구현될 수 있습니다. 예를 들어, 데코레이터에 인자를 전달하거나, 데코레이터를 중첩해서 사용할 수 있습니다.

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            result = ""
            for _ in range(n):
                result += func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def say_hello(name):
    return f"Hello, {name}! "

print(say_hello("Alice"))  # Hello, Alice! Hello, Alice! Hello, Alice!

이 예제에서는 repeat 데코레이터에 호출 횟수 n을 인자로 전달할 수 있습니다. 이를 통해 데코레이터의 동작을 더 유연하게 변경할 수 있습니다.

데코레이터의 장점

데코레이터를 사용하면 다음과 같은 장점을 얻을 수 있습니다:

  1. 코드 재사용성 향상: 데코레이터를 통해 함수의 동작을 쉽게 확장할 수 있습니다.
  2. 가독성 향상: 데코레이터를 사용하면 코드의 의도를 명확히 표현할 수 있습니다.
  3. 유지보수성 향상: 데코레이터를 통해 관련 기능을 한 곳에 모아서 관리할 수 있습니다.

이처럼 Python의 데코레이터는 강력한 코드 확장 기능을 제공합니다. 데코레이터를 활용하면 함수와 클래스의 동작을 효과적으로 수정하고 확장할 수 있습니다.