[Python] - Closure(클로저)

김진수·2020년 12월 11일
0

Python

목록 보기
5/8
post-thumbnail

📕 Closure란?

wikipedia에 정의를 보게 되면

first-class functions의 개념을 이용하여 scope에 묶인 변수를 바인딩 하기 위한 일종의 기술이다.
기능상으로, 클로저는 함수를 저장한 레코드(record)이며, scope의 인수들은 클로저가 만들어질 때 정의되며, 스코프 내의 영역이 소멸되었어도 그에 대한 접근은 독립된 복사본인 클로저를 통해 이루어질 수 있다.

이라고 나와있다.

이는 중첩함수가 부모함수의 변수나 정보를 사용하는 것을 말한다.
그리고 부모함수는 중첩함수를 return하기 때문에 부모함수의 변수는 직접적인 접근을 제한하고 있지만 중첩함수를 통해 부모함수의 변수에 접근이 가능하다. 부모함수와 중첩함수 사이를 자유영역(Free variable) 또는 클로저 영역이라고 한다.

  • 부모함수가 중첩함수를 return
  • 중첩함수는 부모함수의 변수를 접근
  • 변수를 출력

이와 같은 간단한 처리과정으로 closure를 표현할 수 있습니다.
이해가 어려울 거 같아 예제를 보면서 설명하겠습니다.

📗 Closure 예제

결과값

일단 부모함수는 closure()이고, 중첩함수는 averager()입니다. 이제 위에 설명한 것을 토대로 어떠한 로직으로 series가 출력이 되는 지 알아보겠습니다.

  • 부모함수(closure())를 closure_1 변수에 저장
  • 부모함수(closure())를 호출 => return값인 중첩함수(averager) 반환
  • closure_1에는 averager가 저장됨
  • -> closure_1로 중첩함수(averager) 호출 가능
  • closure_1를 호출 중첩함수(averager())실행
  • series변수 출력
  • -> series는 averager함수 내의 없지만 부모함수(closure()) 중첩함수(averager) 사이에서 격리되서 중첩함수(averager) 통해서는 부모함수(closure()) 내의 변수 즉, 자유영역(Free variable)로 접근이 가능하기 때문에 출력이 됩니다

📘 nonlocal

중첩함수가 자유영역(Free variable)변수나 정보를 찾지 못할 때 사용됩니다.

nonlocal 사용하지 않을 경우

결과값

결과값을 보면 UnboundLocalError를 발생한 것을 볼 수 있습니다. 에러가 발생한 이유는 중첩함수 내의 변수가 자유영역(Free variable)를 찾지 못해서 발생합니다. 이런 경우 nonlocal를 사용하면 중첩함수내의 변수가 지역변수 즉 내의 있는 변수가 아님을 뜻하기 때문에 중첩함수 안에서 찾는 것이 아니라 바로 위 외부에서 찾게 되므로 에러가 발생하지 않는다.

nonlocal 사용할 경우

처음 코드와 다른 점은 중첩함수(averager)밑에 nonlocal차이 뿐이다 그리고
위와 같이 print문을 실행한 결과값은
결과값

위와 같이 에러가 발생하지 않고 실행이 되는 것을 확인할 수 있습니다.

profile
백엔드 개발자

0개의 댓글