Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 @ 기호(데코레이터)란 무엇인가? 개념과 동작 원리 총정리

파이썬에서 @ 기호는 데코레이터(decorator)를 정의하고 적용하는 데 사용되는 문법입니다. 데코레이터는 고차 함수(higher-order function)를 간결하게 호출할 수 있도록 도와주는 문법적 설탕(syntactic sugar)입니다.

여기서 데코레이터란, 다른 함수를 인자로 받아 그 함수의 코드를 직접 수정하지 않으면서도 기능을 확장하거나 변경해 주는 함수를 의미합니다.

파이썬 데코레이터의 두 가지 종류

파이썬에는 두 가지 유형의 데코레이터가 있습니다.

  • 함수 데코레이터(Function Decorator): 함수를 장식하여 기능을 확장합니다.
  • 클래스 데코레이터(Class Decorator): 클래스 자체를 장식하여 동작을 수정합니다.

데코레이터의 동작 원리

파이썬에서 데코레이터는 함수나 클래스를 수정하는 데 사용되는 호출 가능한(callable) 객체라면 무엇이든 될 수 있습니다. 함수 또는 클래스에 대한 참조가 데코레이터로 전달되면, 데코레이터는 수정된 함수나 클래스를 반환합니다. 이렇게 반환된 결과물은 일반적으로 원래 함수를 내부적으로 호출하는 구조를 포함합니다.

@decorator
def f(argument):
    ...

위 코드는 사실상 다음과 같이 해석됩니다.

def f(argument):
    ...
f = decorator(f)

즉, @decorator를 함수 위에 붙이면 해당 함수 fdecorator(f)로 대체됩니다. 따라서 이후 f(argument)를 호출하는 것은 decorator(f)(argument)를 호출하는 것과 완전히 동일한 동작입니다.

자주 사용되는 내장 데코레이터

파이썬은 표준 라이브러리 차원에서도 여러 내장 데코레이터를 제공합니다.

  • @staticmethod: 인스턴스 없이 호출할 수 있는 정적 메서드를 정의합니다.
  • @classmethod: 첫 번째 인자로 클래스 자신(cls)을 받는 클래스 메서드를 정의합니다.
  • @property: 메서드를 속성(attribute)처럼 접근할 수 있게 만들어 줍니다.

간단한 커스텀 데코레이터 예제

def my_decorator(func):
    def wrapper():
        print("함수 호출 전")
        func()
        print("함수 호출 후")
    return wrapper

@my_decorator
def say_hello():
    print("안녕하세요!")

say_hello()

위 예제에서 @my_decoratorsay_hello = my_decorator(say_hello)와 같은 의미이며, 실행 시 원래 함수의 동작 앞뒤로 추가 로직이 함께 수행됩니다. 이처럼 데코레이터를 활용하면 로깅, 인증, 성능 측정 등 반복되는 부가 기능을 깔끔하게 재사용할 수 있습니다.