본문 바로가기

코딩

데코레이터; 가마솥에 온도계를 꽂다

728x90
반응형

가마솥 밥의 온도를 잰다. 데코레이터로...

함수를 더 똑똑하게 만드는 데코레이터의 세계

프로그래밍에서 자주 사용하는 개념 중 하나인 "함수"를 다룬다. 그런데 이 함수에 새로운 기능을 더할 수 있는 기법이 있다. 바로 **데코레이터(decorator)**다. 파이썬 초보자들에게 이 개념은 처음에는 조금 어려울 수 있지만, 실생활의 간단한 예를 통해 쉽게 이해할 수 있다.


데코레이터란 무엇인가?

데코레이터는 함수를 꾸며주는 도구다. 함수가 본래의 역할을 하면서도 추가적인 기능을 가지도록 만드는 기법이다.

예를 들어, "특정 함수가 얼마나 걸리는지 측정하고 싶다"고 해보자. 일반적으로는 함수를 호출하기 전에 시작 시간을 기록하고, 호출 후에 끝난 시간을 계산하는 코드를 작성할 것이다. 그러나 이 방식은 같은 작업을 반복하게 만든다.

데코레이터를 사용하면 이 문제를 우아하게 해결할 수 있다. 함수 앞에 @timer라는 데코레이터를 붙이면, 실행 시간을 자동으로 측정해주는 기능을 부여할 수 있다.


데코레이터의 기본 구조

데코레이터는 결국 "함수를 입력받아 새로운 함수를 반환하는 함수"다. 다음과 같은 단계로 작동한다.

  1. 데코레이터는 함수를 매개변수로 받는다.
  2. 내부에 새로운 함수를 작성한다.
  3. 새로운 함수는 원래 함수에 추가 기능을 포함한다.
  4. 새롭게 만든 함수를 반환한다.

이런 구조 덕분에, 함수의 원래 코드에 손을 대지 않고도 원하는 기능을 추가할 수 있다. 이를 **"함수의 확장성"**이라고 한다.


파이썬에서 데코레이터 활용하기

데코레이터는 @ 기호를 사용해 매우 간단하게 적용할 수 있다. 예를 들어, 실행 시간을 측정하는 @timer를 함수 위에 붙이는 것만으로, 해당 함수가 실행될 때마다 시간을 측정한다. 이런 방식은 코드의 가독성을 높이고, 반복적인 코딩을 방지한다.


실생활 예시: 피보나치 수열 계산

데코레이터의 실용적인 예로, 피보나치 수열을 계산하는 프로그램을 만들어 보자. 피보나치 수열은 단순한 규칙으로 작동하지만, 큰 숫자를 계산할수록 시간이 오래 걸린다.

여기에서 **캐시(cache)**라는 기술을 추가한 @cache 데코레이터를 사용하면 이전에 계산했던 값을 저장하여 중복 계산을 피할 수 있다. 이렇게 하면 실행 속도가 크게 향상된다.


문제가 생겼을 때의 해결책: functools 모듈

때로는 데코레이터를 적용했을 때 함수 이름이나 설명(docstring)이 사라질 수 있다. 이를 방지하려면 파이썬의 functools 모듈에 있는 @wraps 데코레이터를 사용하면 된다. 이 도구는 원래 함수의 정보를 보존하며 데코레이터를 적용할 수 있게 해준다.


결론: 왜 데코레이터인가?

프로그래머가 동일한 코드를 반복 작성하는 것은 비효율적이다. 데코레이터는 이런 반복을 줄이고, 코드를 깔끔하게 유지할 수 있도록 도와주는 강력한 도구다. 특히, 시간이 중요한 상황이나, 재사용 가능한 기능이 필요한 곳에서 데코레이터는 필수적인 역할을 한다.


쉬운 이해

"데코레이터"는 이렇게 생각하면 된다. 예를 들어, 밥솥에 밥을 할 때마다 스위치를 누르는 대신, 밥솥에 타이머 기능을 추가했다고 상상해 보자. 이제 타이머가 자동으로 시간을 계산해 밥을 완성한다. "밥솥"이 함수라면, "타이머"는 데코레이터가 되는 것이다.

데코레이터는 프로그램 세계에서 이런 "자동화"를 돕는 역할을 한다.


데코레이터 활용 예

# 데코레이터 정의
def my_decorator(func):
    def wrapper():
        print("Enhancement: Logging before function call")
        func()
        print("Enhancement: Logging after function call")
    return wrapper

# 데코레이터 사용
@my_decorator
def say_hello():
    print("Hello, world!")

say_hello()

** 결과 **

Enhancement: Logging before function call  
Hello, world!  
Enhancement: Logging after function call  

 


관련 영상

Decorators in Python || Python Tutorial || Learn Python Programming

Decorators in Python ❘❘ Python Tutorial ❘❘ Learn Python Programming

728x90
반응형

'코딩' 카테고리의 다른 글

오버라이딩; Overriding  (2) 2024.12.12
Enhancements; 프로그램 개선사항  (0) 2024.12.12
Codeium  (3) 2024.12.12
django REST Framework Mixin 패턴  (1) 2024.12.12
@api_view 데코레이터  (3) 2024.12.05