jju71 님의 블로그
클로저와 데코레이터 본문
1. 클로저
클로저(Closure)는 내부 함수가 자신을 감싸고 있는 외부 함수의 변수에 접근할 수 있는 특성을 가지며, 외부 함수가 호출된 후에도 그 변수의 상태를 기억하고 사용할 수 있는 기능으로, 주로 데이터 은닉과 상태 유지에 활용됩니다.
def mul2(n):
return n * 2
print(mul2(10))
print(mul2(5))
--------------------
20
10
def mul5(n):
return n * 5
print(mul5(10))
print(mul5(5))
------------------------
50
25
# mul1, mul2, mul3 ... mul100도 만들어야 하나?
class Mul:
def __init__(self, m):
self.m = m
def mul(self, n):
return self.m * n
mul2 = Mul(2)
print(mul2.mul(10))
print(mul2.mul(5))
mul5 = Mul(5)
print(mul5.mul(10))
print(mul5.mul(5))
-------------------------
20
10
50
25
class Mul:
def __init__(self, m(:
print("생성자 호출")
self.m = m
def __call__(self, n):
print("call 호출")
return self.m * n
mul2 = Mul(2)
print(mul2(10))
mul5 = Mul(5)
print(mul5(10))
------------------------------
20
50
# 클로저 사용하기
def mul(m):
def wrapper(n):
return m * n
return wrapper
mul2 = mul(2)
print(mul2(10)
mul5 = mul(5)
print(mul5(10))
---------------------------
20
50
2. 데코레이터
데코레이터(Decorator)는 파이썬에서 함수나 클래스에 새로운 기능을 추가할 수 있도록 해주는 문법입니다. 함수 앞에 @ 기호를 붙여 사용하며, 기존 함수를 변경하지 않고도 그 동작을 확장하거나 수정할 수 있습니다. 예를 들어, 실행 시간을 측정하거나, 로그인 여부를 검사하는 기능을 함수에 쉽게 덧붙일 수 있습니다. 데코레이터는 다른 함수를 인자로 받아서 감싸는 방식으로 작동하며, 코드의 재사용성과 가독성을 높이는 데 유용한 도구입니다.
import time
def func1(a, b):
start = time.time() # 현재 시간을 timestamp로 가져옴
print("함수가 시작되었습니다")
result = a + b
end = time.time()
print(f'함수 수행시간: {end - start}')
return result
result = func1(10, 3)
print(result)
----------------------------------------------------------
함수가 시작되었습니다.
함수 수행시간:
13
def func2(a, b):
start = time.time()
print('함수가 시작되었습니다')
result = a * b
end = time.time()
print(f'함수 수행시간: {end - start}')
return result
result = func2(10, 3)
print(result)
---------------------------------------------
함수가 시작되었습니다
함수 수행시간:
30
# 데코레이터 만들기
def func1(a, b):
result = a + b
return result
def func2(a, b):
result = a * b
return result
def elapsed(func): # 클로저 형식 > 내부함수 존재
def wrapper(a, b):
start = time.time()
print('힘수가 시작되었습니다')
result = func(a, b)
end = time.time()
print(f'함수 수행시간: {end - start}')
return result
return wrapper
deco1 = elapsed(fun1)
result = deco1(10, 3)
print(result)
deco2 = elapsed(func2)
result = deco2(10, 3)
print(result)
----------------------------------------------------
함수가 시작되었습니다
함수 수행시간:
13
함수가 시작되었습니다
함수 수행시간:
30
@elapsed
def func1(a, b):
result = a + b
return result
result = func1(10, 3)
print(result)
---------------------------
함수가 시작되었습니다
함수 수행시간:
13
@elapsed
def fun2(a, b):
result = a * b
return result
result = func2(10, 3)
print(result)
-------------------------
함수가 시작되었습니다
함수 수행시간:
30'Python' 카테고리의 다른 글
| 타입 어노테이션 (0) | 2026.07.24 |
|---|---|
| [DBMS] MySQL을 활용한 단어장 (0) | 2026.06.09 |
| [DBMS] MySQL 연동 (0) | 2026.06.09 |
| [Python] 모듈 (0) | 2026.06.01 |
| [Python] 매직 메서드 (0) | 2026.05.29 |