jju71 님의 블로그

클로저와 데코레이터 본문

Python

클로저와 데코레이터

jju71 2026. 7. 26. 03:05

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