롸?

클로저 본문

프로그래밍/Python

클로저

허니버터새우깡 2020. 5. 7. 17:44

1. 일급함수

클로저를 이해하기 전에 일급함수의 이해가 필요하다. 파이썬은 기본적으로 일급함수를 지원한다.

일급함수는 다음 특징을 충족해야한다

조건 예제 코드
함수를 변수에 할당 가능
def square(x):
    return x * x
    
f1 = square    #괄호가 없으면 그 자체
f2 = square(5) #괄호를 붙이면 함수가 돌려주는 리턴값
함수를 함수의 인자로 전달 가능
def square(x):
    return x ** 2
 
def my_func(func, arg_list):
    result = []
    for i in arg_lists:
        result.append(func(i)) 
        #func()는 함수를 호출한 '결과(return)' 값을 얻는다.   
        #여기서 얻어진 값들을 빈 result 리스트에 넣는다. 
 
num_list = [1, 2, 3]
squares = my_func(square, num_list) # square 함수를 인자(argument)로 해서 전달한다! 
 
print(squares)   #[1, 4, 9]
함수를 다른 함수 내에서 정의 가능
def log(msg):
    def log_message():
        print("Log : ", msg)
    return log_message
함수의 결과값으로 또 다른 함수를 리턴 가능
def log(msg):
    def log_message():
        print("Log : ", msg) 
    return log_message   #log_message 함수 자체를 리턴하고있다.
 
log_hi = log("Hello Everybody")
print(log_hi) #<function log.<locals>.log_message at 0x7f8638260c80>
log_hi()      #Log :  Hello Everybody

 

 

2. 클로저(Closure)

프로그래밍 언어에서의 클로저란 퍼스트클래스 함수를 지원하는 언어의 네임 바인딩 기술이다. 클로저는 어떤 함수를 함수 자신이 가지고 있는 환경과 함께 저장한 레코드이다. 또한 함수가 가진 프리변수(free variable)를 클로저가 만들어지는 당시의 값과 레퍼런스에 맵핑하여 주는 역할을 한다. 클로저는 일반 함수와는 다르게, 자신의 영역 밖에서 호출된 함수의 변수값과 레퍼런스를 복사하고 저장한 뒤, 이 캡처한 값들에 액세스할 수 있게 도와준다.
프리변수(free variable)란?
파이썬에서 프리변수는 코드블럭안에서 사용은 되었지만, 그 코드블럭안에서 정의되지 않은 변수를 뜻한다.

 

 

 - 예제 1

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))   #8 11 14 17 20

mul_add는 calc에서 정의된 변수 a와 b를 사용한 결과값을 리턴하고 있다. 

 

 - 예제 2

def say_words(msg):
    def say_sentence():
        return "안녕? 이걸 출력해줘! : {}".format(msg)
    return say_sentence

a = say_words("출출하다")
print("a는? : ", a)   #<function say_words.<locals>.say_sentence at 0x7fc2c039c0d0>
print("a()는 ?", a()) #안녕? 이걸 출력해줘! : 출출하다

마찬가지로 say_words 안에 정의된 say_sentence는 바깥 함수의 msg를 사용하고 있다.

 

 

클로저는 다른 함수에 의해 동적으로 생성되고, 바깥 함수로부터 생성된 변수값을 알고 있는 변수이다.

 

 

 


참고 

1.  https://whatisthenext.tistory.com/111

2.  http://schoolofweb.net/blog/posts/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A1%9C%EC%A0%80-closure/

3.  https://nachwon.github.io/closure/

4.  https://dojang.io/mod/page/view.php?id=2366

 

'프로그래밍 > Python' 카테고리의 다른 글

모듈  (0) 2020.05.08
클래스  (0) 2020.05.08
함수, lambda  (0) 2020.05.07
제어문 - if, while, for  (0) 2020.05.07
자료형 - String, List, Set, Tuple, Dict  (0) 2020.05.07
Comments