Python | 클로저

Sua·2020년 12월 26일
2

Python

목록 보기
20/28
post-thumbnail

클로저란?

함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 기억하다가, 함수를 호출할 때 다시 꺼내서 사용하는 기법을 클로저(closure)라고 한다. 클로저는 외부함수에 어떤 변화(심지어는 삭제)가 발생되어도 자신의 스코프는 지킨다.

클로저의 조건

클로저의 조건은 다음과 같다.
1. 어떤 함수의 내부 함수여야한다.
2. 자신을 둘러싼 함수의 상태를 참조한다.
3. 외부함수는 해당 함수를 반환해야 한다.

def calc():
    a = 3
    b = 5
    def mul_add(x):
        return a * x + b   # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
    return mul_add         # mul_add 함수를 반환
 
c = calc()
print(c(1), c(2), c(3), c(4), c(5))

여기서는 c에 저장된 함수가 클로저이다. 함수 calc가 끝났는데도 c는 calc의 지역 변수 a, b를 사용해서 계산을 하고 있다.

lambda로 클로저 만들기

def calc():
    a = 3
    b = 5
    return lambda x: a * x + b    # 람다 표현식을 반환
 
c = calc()
print(c(1), c(2), c(3), c(4), c(5))
8 11 14 17 20

클로저의 지역변수 변경하기

외부함수의 지역 변수를 가져오기만 했는데, 지역 변수를 변경하고 싶다면 nonlocal을 사용하면 된다.

def calc():
    a = 3
    b = 5
    total = 0
    def mul_add(x):
        nonlocal total
        total = total + a * x + b
        print(total)
    return mul_add
 
c = calc()
c(1)
c(2)
c(3)
8
19
33

클로저를 언제 사용할까?

클로저를 사용하면 프로그램의 흐름을 변수에 저장할 수 있다. 클로저는 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용한다. 클로저에 속한 지역 변수는 바깥에서 직접 접근할 수 없으므로 데이터를 숨기고 싶을 때 활용한다.

하지만, 파이썬에서는 클래스를 지원하기 때문에 클로저의 효용가치가 많이 떨어진다.
왜냐하면 굳이 클로저로 구현하지 않고 클래스를 만들어서 클래스 내부에 함수를 정의해 놓으면 언제든지 객체를 만들어서 해당 인스턴스를 불러올 수 있기 떄문이다.
따라서 클로저 같은 경우 클래스를 지원하지 않는 자바스크립트와 같은 언어에서 클래스를 재현하기 위해 사용한다.

본 포스팅은 아래의 사이트를 참고하여 작성되었습니다.
코딩도장 https://dojang.io/
https://www.youtube.com/watch?v=swU3c34d2NQ
http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A1%9C%EC%A0%80-closure/
https://shoark7.github.io/programming/python/closure-in-python
https://velog.io/@dlghddlf1992/python-%ED%81%B4%EB%A1%9C%EC%A0%80
https://www.fun-coding.org/PL&OOP4-3.html
https://daeguowl.tistory.com/75
https://wikidocs.net/83687

profile
Leave your comfort zone

1개의 댓글

comment-user-thumbnail
2022년 3월 16일

덕분에 클로저 개념 정리했습니다. 감사합니다.

답글 달기