[python] 클로저(Closure)

Cjw.dev·2023년 3월 14일
0

Python

목록 보기
6/7

클로저
함수의 영역 밖에서도 호출된 함수의 변수값으로 접근하게 해주는 기술(방법)


클로저의 특징
1. 함수가 종료되어도 클로저가 기억하는 변수는 소멸하지 않음
2. 함수 종료시 지연변수가 소멸되지 않고 변수와 내부의 함수를 전역에서 사용할 수 있는 특징이 있음.
3. 파이썬의 함수는 일급객체 취급 받는다. 변수, 데이터 값등으로 저장 가능
클로저는 내부함수를 반 영구적으로 사용할 수 있는 방법


클로저 예제1

def add(a, b):
    return a + b

# 함수를 변수에 할당
sum = add

# 함수를 인자로 전달
def calc(func, a, b):
    return func(a, b)

result = calc(sum, 10, 20)
print(result)  # 30 출력

# 함수를 반환값으로 사용
def get_add_func():
    return add

add_func = get_add_func()
result = add_func(30, 40)
print(result)  # 70 출력

클로저 예제2

def china_seller():
    sel = 5
    def seller_charge(money):
        return money*sel
    return seller_charge

charge = china_seller()
print(charge(10000000))

클로저의 처리형태 정리

위의 코드는 seller()라는 외부함수가 존재하고
seller_charge()라는 내부함수가 존재하고 있다.
클로저를 쉽게 이해하기 위해서는 리턴값, 받아오는 주소를
주목할 필요가 있었음.
seller_charge 함수의 리턴값과 seller 함수의 리턴값을 보면
seller_chage 함수의 리턴값은 파라미터 money와
seller의 지역변수 sel을 곱한값을 리턴해주고 있음.
seller 함수는 지역변수 sel을 선언후 seller_charge를
정의해주고 있으며 seller_charge 함수 그 자체를
리턴해주고 있음.

전역에서 charge라는 변수를 선언하고 seller 함수의
리턴값을 할당받은후 그 리턴값은 seller 함수의 내부함수인
seller_charge 함수 그 자체를 가져온다(주소값)
즉 charge 변수는 seller_charge 함수 그 자체로서의
기능을 수행할수 있게 되었고 charge 변수를 쓸때마다
인수를 요구하는 상태가 된것이다.


파라미터의 갯수 제한 없애기

파이썬에서는 파라미터를 1개만 선언해도 인수를 여러개 입력해도 받아올 수 있는 방법이 있다.

def add_many(*agrs):
    print(agrs)
    
add_many(1,2,3,4,5)

'*임시변수'를 파라미터로 주면 인수 여러개를 한번에 받아온다.
개발자들끼리 공통된 약속으로 agrs를 사용하여 '어떤 인수를 받아올 지 정확히 규정되지 않아쓸 때' 라는 의미로 사용한다.

profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글