Python | Closure

한성봉·2021년 7월 24일
0

Closure

closure는 단지 파이썬에만 국한된 개념은 아니다. 하지만 현재 파이썬 언어로 공부중이기 때문에 파이썬으로 한번 알아보겠다. 우선 나는 단순히 클로저를 중첩 함수정도로만 알고 있었다. 하지만 오늘 조금 더 자세하게 알아보자.

closure는 단어 그대로 폐쇄라는 의미이다. 무엇인가를 가둔다는 의미이다. 외부로부터 격리한다는 의미가 더 강하다. 클로저를 제대로 이해하려면 nested function(중첩함수), First-class-citizen(일급객체), Scope(스코프) 의 개념들이 종합적으로 나오니 선행학습이 필요하다.

이 개념들을 정리하자면

  1. 중첩함수가 부모함수의 변수나 정보를 중첩함수 내에서 사용한다.
  2. 부모함수는 리컨값으로 중첩함수를 리턴한다.
  3. 부모 함수에서 리턴 했으므로 부모 함수의 변수는 직접적인 접근이 불가능 하지만 부모 함수가 리턴한 중첩 함수를 통해서 사용될 수 있다.

정리한 내용들에서 위에서 언급한 선행학습 개념들이 전부 나온다.

그렇다면 closure는 언제 사용하는 것일까요?

어떠한 정보를 기반으로 연산을 실행하고 싶지만 기반이 되는 정보는 접근을 제한하여 노출이 되거나 수정이 되지 못하게 하고 싶을때 사용한다.

파이썬에서 클로저는 ‘자신을 둘러싼 스코프(네임스페이스)의 상태값을 기억하는 함수’다. 그리고 어떤 함수가 클로저이기 위해서는 다음의 세 가지 조건을 만족해야 한다.

다음 예시를 함수 예시를 한번 살펴보자..
만일 주어진 어떠한 숫자 를 구하는 함수는 다음과 같을 것입니다.

def calculate_power(number, power):
    return number ** power


calculate_power(2, 7)
> 128

자 이제, 주어진 숫자의 승을 구하는게 아니라 특정 숫자의 승을 구하는 함수를 구현한다고 생각해봅시다. 예를 들어, 2의 승을 구하는 함수를 구현한다면 다음과 같습니다.

def calculate_power_of_two(power):
    return 2 ** power
calculate_power_of_two(7)
> 128
calculate_power_of_two(10)
> 1024

하지만 위의 함수는 2의 승밖에 구할 수 없습니다.

만일 특정 숫자의 숭을 구하는 함수가 필요 하지만 2가 아니라 설정되는 수의 승을 구하는 함수는 어떻게 구현할 수 있을까요?

이때 closure를 사용할 수 있습니다.

def generate_power(base_number):
    def nth_power(power):
        return base_number ** power

    return nth_power
 
calculate_power_of_two = generate_power(2)
calculate_power_of_two(7)
> 128
calculate_power_of_two(10)
> 1024

calculate_power_of_seven = generate_power(7)
calculate_power_of_seven(3)
> 343
calculate_power_of_seven(5)
> 16907
def generate_power(base_number):
    def nth_power(power):
        return base_number**power
        
    return nth_power
    
    
    power_of_two = generate_power(2)
    power_of_two(7)
    
    # 2^7 = 128

클로저는 이렇게 하나의 함수로 여러가지의 함수를 간단히 만들어낼 수 있게도 해주며, 기존에 만들어진 함수나 모듈등을 수정하지 않고도 wrapper 함수를 이용해 커스터마이징할 수 있게 해주는 기특한 녀석입니다.

0개의 댓글