학습 목표
이번 강의에서는 파이썬의 데코레이터(Decorator) 개념을 이해하고, 기본적인 예제를 통해 이를 적용하는 방법을 배웁니다. 데코레이터는 함수를 감싸고 추가적인 기능을 제공하는 강력한 도구입니다.
개념 설명
데코레이터는 주로 다른 함수에 기능을 추가하는 방식으로 동작합니다. 기존의 함수를 변경하지 않고, 그 함수의 기능을 확장할 수 있는 방법입니다. 데코레이터는 함수의 시작 부분에 '@deco_name' 형식으로 표시되며, 함수 정의 바로 위에 위치해야 합니다. 이를 통해 함수가 호출될 때 데코레이터가 적용됩니다.
예제 코드
# 기본적인 데코레이터 함수 정의
def my_decorator(func):
def wrapper():
print("함수가 호출되기 전입니다.")
func() # 원래 함수 호출
print("함수가 호출된 후입니다.")
return wrapper
# 데코레이터를 적용할 함수
@my_decorator
def say_hello():
print("안녕하세요!")
# 데코레이터가 적용된 함수 호출
say_hello() # 결과: 데코레이터의 효과를 보여줌
코드 설명
위 코드는 기본적인 데코레이터의 사용 예제를 보여줍니다.
- 먼저,
my_decorator
라는 데코레이터 함수를 정의합니다. 이 함수는 다른 함수를 인자로 받아들이고, 내부에wrapper
라는 함수를 정의합니다. wrapper
함수는 원래의 함수가 호출되기 전과 후에 추가적인 메시지를 출력합니다.- 이후
say_hello
라는 함수를 정의하고, 위에@my_decorator
를 붙여 데코레이터를 적용합니다. 따라서, 이 함수를 호출하면 데코레이터의 내용이 실행됩니다.
연습 문제
1. 함수 실행 시간을 측정하는 데코레이터를 작성하여, 원래 함수의 실행 시간과 함께 결과를 출력하는 프로그램을 만들어 보세요.
2. 함수에 전달된 인자를 출력하는 데코레이터를 작성해 보세요. 사용자가 입력한 인자를 출력한 후, 원래 함수 결과를 반환해야 합니다.
연습 문제 해답
# 1번 문제: 함수 실행 시간을 측정하는 데코레이터
import time
def timing_decorator(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} 초")
return result
return wrapper
@timing_decorator
def compute_sum(n):
return sum(range(n))
print("합계:", compute_sum(1000000)) # 테스트
# 2번 문제: 인자를 출력하는 데코레이터
def print_args_decorator(func):
def wrapper(*args, **kwargs):
print("인자:", args, kwargs) # 전달된 인자 출력
return func(*args, **kwargs) # 원래 함수 호출
return wrapper
@print_args_decorator
def greet(name):
return f"안녕하세요, {name}님!"
print(greet("홍길동")) # 테스트
### 설명
- **데코레이터 개념**을 도입하여 함수의 기존 기능에 추가적인 작업을 수행하는 방법을 보여줍니다.
- **함수의 실행 시간 측정** 및 **인자 출력 데코레이터**를 활용하여 응용력을 높이는 데 초점을 맞췄습니다.
- 데코레이터는 코드의 재사용성과 가독성을 높일 수 있는 유용한 도구이며, 연습 문제를 통해 이를 효과적으로 적용할 수 있습니다.
0 댓글