클로저(Closure)란?

야란·2021년 7월 18일
0

일급함수(First class Function)을 지원하는 언어의 네임 바인딩 기술

중첩함수(Nested Function)

클로저와 데코레이터를 이해하기 전에 중첩함수를 이해해보자!

def greeting():  [1]
    def hello():  [2]
        print("Hello!")  [3]
        
    hello()  [4]

>>>greeting()
Hello!  # 출력됨

greeting() -> [1] -> [4] -> [2] -> [3]
순서로 동작해서 결과가 Hello!가 나옴

중첩함수 Helo()는 부모함수 greeting()에서만 사용할 수 있다

중첩함수 사용 이유?

  • 가독성 : 반복되는 액션을 함수 안에서 정의하면 코드 길이를 줄이고 가독성을 높힘
  • closure

클로저 (closure)

부모함수의 변수나 정보를 가둔다!
클로저는 어떤 함수의 내부 함수가 외부 함수의 변수(*프리변수)를 참조할 때,
외부 함수가 종료된 후에도 내부 함수가 외부 함수의 변수를 참조할 수 있도록
어딘가에 저장하는 함수를 의미합니다.

조건)
1. Nested 구조를 갖춰야한다(중첩)
2. 중첩함수가 부모함수의 변수나 정보를 중첩함수 내에서 사용해야 한다
3. 부모함수는 return 값으로 중첩함수를 return 해야 한다

주로 factory 패턴을 구현할 때 사용함(무언가 생성해내는 패턴)
함수나 object 생성

factory에서 뭔가 생성 하려면 설정값이 필요한데,
이 설정값을 숨겨서 수정이 불가능하게(closure의 개념)하면서 설정값을 기반으로 한
연산을 할 수 있는 함수를 만들때, clouser를 사용할 수 있다

def generate_power(base_number):    [1]
    def nth_power(power):           [2]
        return base_number ** power [3]
    return nth_power                [4]
    
# closure 생성 및 출력
>>>calculate_power_of_two = generate_power(2) [5] 클로저 생성
>>>calculate_power_of_two(7) [6] 
128 -> 2 ** 7
 
[1]->[5]->[1]->[2]->[4]->[6] >[2]->[3]

def calc(): [1]
    a = 3   
    b = 5   
    def mul_add(x): [2]
        return a * x + b   # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산 [3]
    return mul_add         # mul_add 함수를 반환( ()를 사용하지 않음) [4]
 
>>>c = calc() 클로저 생성  [5]
>>>print(c(1), c(2), c(3), c(4), c(5)) [6]
8,11,14,17,28

[1]->[5]->[1]->[2]->[4]->[6] >[2]->[3]


def outer_func(): [1]
    message = 'Hi' [3]

    def inner_func(): [4]
        print message [6] 

    return inner_func() [5]

outer_func() [2]

[]순서
Hi

클로저 : 넘 어려움

profile
🤦🏻‍♀️ 아차차

0개의 댓글