클로저(Closure)

1. Nested Scope

def안 다른 def를 정의했을 때 Nested Scope가 생긴다.

innter def를 감싸는(enclosing) outer def의 scope를 enclosing function(def) scope라고 한다.

(주의: def안에서 선언된 변수는 모두 Local이다.)

X = 10 # Global

def outer():
    Y = 100 # Local to outer def and Enclosing Scope. (Enclosing def local)
    def inner():
        Z = 200 # Local to inner def

2. Closure (function maker or factory function)

위에서 설명한 Nested Scope와 관련된 Functional Programming의 technique중 하나이다.

원리 : 함수 안에서 선언된 또 다른 함수는 enclosing scope를 기억한다

즉, innerouter의 scope를 기억하고 있다.

따라서 outer의 영역이 메모리에서 소멸되었어도, inner는 여전히 outer의 scope에 있는 변수에 접근할 수 있다.

간단한 예


def exponentN(N):
    # 매개 변수 N은 enclosing scope에 존재.
    def action(X):
        return X ** N # 내부 함수에서 N에 접근 중.
    return action # 내부에서 선언한 함수를 반환

exponent2 = exponentN(2)
exponent2(2) # returns 4
exponent2(3) # returns 9

exponentN 함수가 반환하면서 local scope가 소멸되었지만, 반환된 action은 스코프를 기억하고 있다.

위와 같은 기법을 통해서 똑같은 작동방식을 가지지만 수가 다른 여러가지 함수를 만들어 낼 수 있다.


exponent3 = exponentN(3)
exponent4 = exponentN(4)
exponent5 = exponentN(5)

exponent3(2) # 2 ** 3. returns 8
exponent4(2) # 2 ** 4. returns 16
exponent5(2) # 2 ** 5. returns 32