이번 포스트에서는 클로저와 데코레이터에 대해 알아보겠습니다.
1) 클로저와 데코레이터란?
클로저는 함수안에서 함수를 반환하는 경우에, 반환되는 함수를 일컫는 말입니다.
주로 재귀함수나 함수를 순차적으로 실행하는 경우에 사용할 수 있는데
이를 통해 재사용성이 높은 함수 구조를 만들 수 있습니다.
데코레이터는 함수를 확장하는 함수로서 @ 기호를 사용하여 어노테이션으로 사용할 수 있습니다.
주로 반복되는 작업을 여러 함수에 적용하는 경우나 또는
기존 함수를 수정하지 않고 추가구현하는 경우에 사용이 가능합니다.
이제 예제를 통해 클로저와 데코레이터를 사용해보겠습니다.
2) 클로저의 예제
클로저를 통해 간단한 곱셈을 수행하는 함수를 만들어보겠습니다.
def Mul(m):
def closure(n):
return m * n
return closure
Mul3 = Mul(3)
Mul5 = Mul(5)
print(Mul3(10))
print(Mul5(10))
위의 코드를 보겠습니다.
Mul 함수에서는 클로저인 closure를 호출하고있습니다.
따라서 Mul 함수는 최종적으로 closure를 리턴하게 됩니다.
이제 다음의 코드에서
Mul3에는 m = 3인 Mul 함수가 저장됩니다.
그리고 Mul5에서는 m = 5인 Mul 함수가 저장됩니다.
촤종코드에서는 각각의 Mul 함수에 n 값을 집어넣어 연산을 실행하게 됩니다,
따라서 최종 코드의 실행 결과는 다음과 같습니다.
3) 데코레이터의 예제
이번에는 데코레이터를 사용하여 함수의 수행시간을 측정해보도록 하겠습니다.
import time
def elapsed(func):
def closure(a, b):
print("함수실행")
start = time.time()
result = func(a, b)
end = time.time()
print("함수 수행시간 : %f초" % (end - start))
return result
return closure
@elapsed
def func1(a, b):
return a + b
@elapsed
def func2(a, b):
return a * b
res1 = func1(1, 2)
print(res1)
res2 = func2(1, 2)
print(res2)
코드는 위와 같습니다.
elapsed 함수는 클로저인 closure를 사용하여 인자로 들어온 함수의 실행시간을 출력합니다.
출력할 함수는 func1과 func2이고 각각 인자에 대한 덧셈과 곱셈을 수행합니다.
이때 @ 기호를 사용하여 해당 함수들에 대해 데코레이터를 적용하겠습니다.
따라서 최종실행 결과는 다음과 같습니다.