파이썬 개발자라면 누구나 한번쯤은 `@` 데코레이터를 사용해 봤을 겁니다.
하지만 이 `@` 심볼 뒤에 숨겨진 코드가 실제로 어떻게 실행되는지 완벽하게 이해하는 개발자는 드물죠.
오늘은 데코레이터의 작동 원리를 파헤쳐 보고, 여러분의 파이썬 실력을 한 단계 업그레이드해 보겠습니다.
데코레이터란 무엇인가?
데코레이터는 한마디로 "함수를 감싸는 함수"입니다.
이 말은, 어떤 함수에 추가적인 기능을 더하거나, 함수의 동작 방식을 수정하고 싶을 때 데코레이터를 사용한다는 뜻이죠.
마치 선물 포장지처럼, 원래 함수의 내용을 바꾸지 않으면서 겉모습을 꾸며주는 역할을 한다고 생각하면 됩니다.
최근에는 함수뿐만 아니라 클래스에도 데코레이터를 적용하는 방법도 많이 사용되고 있습니다.
@ 심볼의 역할
`@` 심볼은 데코레이터를 적용하는 아주 편리한 문법입니다.
함수 정의 바로 위에 `@데코레이터_이름` 형태로 사용하면, 파이썬 인터프리터는 해당 함수를 데코레이터 함수에 인자로 넘겨 실행합니다.
예를 들어 `@my_decorator` 라고 쓰고 그 밑에 `def my_function():`을 정의했다면, `my_function = my_decorator(my_function)` 과 똑같이 작동하는 것이죠.
결국 `@` 심볼은 데코레이터를 "자동으로" 호출해 주는 단축키와 같은 역할을 합니다.
데코레이터 함수의 구조
데코레이터 함수는 일반적으로 다음과 같은 구조를 가집니다.
데코레이터 함수는 꾸밈을 받을 함수를 인자로 받습니다.
데코레이터 함수 내부에 래퍼(wrapper) 함수를 정의합니다.
래퍼 함수는 꾸밈을 받을 함수를 호출하기 전후에 추가적인 기능을 수행합니다.
데코레이터 함수는 래퍼 함수를 반환합니다.
이 구조를 통해 데코레이터는 원래 함수의 코드를 직접 수정하지 않고도 기능을 확장할 수 있습니다.
마치 레고 블록처럼, 기존 코드에 새로운 기능을 덧붙이는 것이죠.
데코레이터 사용 예시: 실행 시간 측정
데코레이터의 가장 흔한 사용 예 중 하나는 함수의 실행 시간을 측정하는 것입니다.
다음은 실행 시간을 측정하는 데코레이터의 예시입니다.
```python
import time
def timer(func):
def wrapper(*args, kwargs):
start_time = time.time()
result = func(*args, kwargs)
end_time = time.time()
print(f"함수 {func.__name__} 실행 시간: {end_time - start_time:.4f}초")
return result
return wrapper
@timer
def my_function(n):
time.sleep(n)
my_function(2) # 함수 my_function 실행 시간: 2.0000초
```
위 코드에서 `timer` 데코레이터는 `my_function`의 실행 전후 시간을 측정하여 출력합니다.
`@timer`를 사용함으로써 `my_function`의 코드를 변경하지 않고도 실행 시간 측정 기능을 추가할 수 있었습니다.
이처럼 데코레이터는 코드의 재사용성을 높이고, 유지보수를 용이하게 해주는 강력한 도구입니다.
데코레이터 사용 시 주의사항
데코레이터를 사용할 때는 몇 가지 주의해야 할 점이 있습니다.
첫째, 데코레이터가 원래 함수의 `__name__`과 `__doc__`을 덮어쓸 수 있으므로, `functools.wraps`를 사용하여 원래 함수의 메타데이터를 보존하는 것이 좋습니다.
둘째, 데코레이터를 과도하게 사용하면 코드의 가독성이 떨어질 수 있으므로, 적절한 수준에서 사용하는 것이 중요합니다.
데코레이터는 파이썬의 강력한 기능 중 하나이며, 잘 활용하면 코드의 효율성과 가독성을 크게 높일 수 있습니다.
오늘 살펴본 내용을 바탕으로 데코레이터를 자유자재로 활용하여 더욱 멋진 파이썬 코드를 작성해 보세요.
데코레이터를 통해 여러분의 코딩 생활이 더욱 풍요로워지기를 바랍니다.
'개발' 카테고리의 다른 글
| 파이썬에서 날짜와 시간 다루기 (0) | 2026.02.03 |
|---|---|
| 파이썬의 context manager와 with 문 이해하기 (0) | 2026.02.03 |
| 데코레이터(decorator)를 쉽게 이해하는 비유 (0) | 2026.02.03 |
| 파이썬에서 참조(reference)가 헷갈리는 이유 (0) | 2026.02.03 |
| 파이썬에서 얕은 복사 vs 깊은 복사, 실수하기 쉬운 포인트 (0) | 2026.02.03 |