클로저는 개념이 조금 어렵다.

 

클로저 사용하기 전에 우선 변수의 범위에 대해서 알고 있어야 한다. 아래 포스팅을 참고한다.

 

 

파이썬 지역변수와 전역변수 global 키워드

변수의 제한 범위를 지역변수와 전역변수로 나눈다. 함수의 안에 있는 변수를 지역변수 바깥에 있는 변수를 전역변수로 구분한다. 아래 예제를 통해서 알아본다. apple = 15 def func1 (): print("Local fun

digiconfactory.tistory.com

범위는 크게 지역변수와 전역변수로 나뉘어 진다. 객체지향 프로그래밍으로 넘어오게 되면서 접근 제한자 등의 개념이 생겼다. 그것도 결국 변수의 범위에 대한 내용을 해석하는 방식이다. 외부 클래스에서 내부 클래스의 멤버 변수에 접근할 수 없도록 하는 것이 정보의 은닉화다.

 

클로저를 쉽게 설명해보면,

 

함수를 호출한 후 에도 그 함수 지역의 정보를 계속 사용할 수 있게 해준다.

 

일반적으로 함수를 호출할 때 스택에 저장되는 사실을 안다면 이해가 간다.

 

예를 들어 파이썬을 처음 시작하는 __main__ 영역에서 function 이라는 함수를 호출한다. 호출과 동시에 function을 스택이라는 메모리 구조에 로드한다. 호출이 끝나고 return 문을 만나면 스택을 해제한다. 그러면 이 안에 있는 데이터들은 사용할 수 없다. 클로저는 이 지역 데이터를 계속 사용할 수 있도록한다.

 

예제> 클로저 사용

def cal():
    count = 0
    sum = 0
    def add(a,b):
        nonlocal count,sum
        print("add :", a,"+",b,"=",a+b)
        sum += a + b
        count += 1
        print("sum :",sum,"count :",count)
        print("-"*20)
    return add

closureAdd = cal()
closureAdd(1,2)
closureAdd(3,4)
closureAdd(10,2)
closureAdd(99,23)

함수 cal이 있고 중첩함수 add가 있다. cal을 호출하면 add가 반환된다. 여기서 return add() 가 아니라 return add 인 점에 주의한다. 함수는 실행코드지만 인스턴스처럼 참조할 수도 있다. 즉 주소를 주는 것이다.

 

여기에 더해 클로저는 이 함수에 대한 정보를 저장한다. add에서 nonlocal 변수는 cal 의 지역변수이다. 호출이 끝나도 count 와 sum은 값을 유지하고 있다. 마치 전역변수를 사용하는 것 같은 효과를 낸다.

 

클로저를 사용하면 지역변수와 코드를 현재 영역에서 독립시킬 수 있다. 또 데이터를 외부에서 접근할 수 없기 때문에 데이터의 보안성도 좋아진다.

 

람다표현식과 같이 사용하기도 한다. 람다는 익명함수, 이름이 없는 함수이고 클로저는 함수가 사용되는 환경을 유지하며 사용하는 함수이다. 둘다 함수니까 혼동에 주의한다.

 

 

파이썬 | 람다 표현식 | 익명 함수

람다 표현식은 익명 함수라고도 불린다. 람다는 함수의 기능을 수행한다. 람다를 처음 듣고 단어 자체의 생소함에서 오는 막막함이 있다면 걱정하지 않아도 된다. 람다는 함수의 일종이다. 파이

digiconfactory.tistory.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band