🗂️

4.7.7. factory 함수, 클로저

 

클로저

클로저는 함수의 재사용성을 사용하여 만든 함수입니다. python의 디자인 패턴과 관련된 요소로서 단순히 python에서만 쓰이는 것이 아닌 다른 언어에서도 디자인 패턴이 존재합니다.
 
입력
def 승수(x, y): return x ** y print(승수(2, 3)) print(승수(3, 2)) print(승수(4, 3))
 
출력
8 16 32
 
그런데 이 함수를 굉장히 많이 사용할 것이라 하나의 패턴으로 패턴화 하고 싶다면 어떻게 해야할까요?
 
입력
def 승수(n): def 함수(x): return x ** n return 함수 a = 승수(3) #a는 승수라는 함수를 가지게 됩니다. b = 승수(4) c = 승수(5) a(2) # b(2) c(2)
 
출력
8 16 32
 
이렇게 함수의 재사용성을 좀 더 다르게 해서 만든 것이 closer입니다.
 
지금 작성한 '함수'가 생각보다 간단하기 때문에 앞에서 배웠던 lambda로 한번 처리해 볼까요?
입력
def 승수(n): return lambda x : x ** n a = 승수(3) b = 승수(4) c = 승수(5) a(2) b(2) c(2)
 
출력
8 16 32
 
함수 내 지역 변수는 내부에서만 처리되며 클로저 외부에 전달된 내부 함수를 활용해서 함수 내부를 이용하거나 변경할 수 있습니다.
외부에 전달된 내부 함수가 변수에 할당되었기 때문에(여기서는 a, b, c에 할당되었어요) 클로저 환경은 항상 재사용이 가능한 상태로 남아 프로그램이 종료되기 전 까지 외부 함수도 계속 남아있게 됩니다.
함수 내에서의 함수, 함수 밑에서의 변수 등 메모리의 관계는 직접 정리해 보는 것이 좋아요.
전역변수 global도 함수 안에서 어떤 값을 사용할 것 인지에 대한 키워드이기 때문에 예제를 한번 보도록 할게요.
 
입력
x = 3 y = 10 def 함수1(): x = 10 y = 20 def 함수2(): global x #밖에 있는 변수에 접근합니다. global y x + =10 y + =10 return x + y return 함수2() 함수1()
 
출력
13
 
이 예제에서는 global이라는 키워드를 사용했기 때문에 가까운 변수인 함수1의 x, y에 접근하는 것이 아닌 전역변수 즉, 함수 밖에 있는 x, y에 접근하게 됩니다.
 
입력
x = 3 y = 10 def 함수1(): x = 10 y = 20 def 함수2(): nonlocal x #안에 있는 변수에 접근합니다. nonlocal y x + =10 y + =10 return x + y return 함수2() 함수1()
 
출력
50
 
반면 이 예제에서는 nonlocal을 사용했기 때문에 함수1에 재정의 한 x, y를 접근하게 됩니다.