개발자의 길

[Python3] Nested function, First class function, Closure function 이란 무엇인가?

토아드 2022. 3. 6. 17:35
반응형

1. Nested function ( 중첩 함수 )

 중첩 함수는 간단히 말하면 함수 정의 안에 또하나의 함수가 정의될 수 있는데, 이때 함수 안에 정의된 함수를 중첩 함수라고 한다. 이 함수는 일반적으로는 해당 함수가 정의된 함수의 내부에서만 사용될 수 있다.

 

def first():
	print( "hey" )
    def second():
    	return  "hello" 
    print( second() )

 

2. First class function ( 일급함수 ) 

 일급 함수라는 개념은 파이썬에 한정된 개념이 아닌, CS 전반에 걸쳐서 통용되는 개념이다.

 이 함수는 다음을 충족하는 함수이다.

 1. 함수 내에 변수를 선언할 수 있다.

 2. 함수의 매개변수로 다른 함수를 전달할 수  있다.

 3. 함수의 반환값(return) 으로 다른 함수를 전달할 수 있다.

 

 그렇다면 파이썬이라는 언어에서 함수는 위 조건을 만족할까? 파이썬은 기본적으로 모든 것들이 객체로 취급되어, 함수도 객체로 취급된다.  그러므로 파라미터로 전달도 가능하며, 리턴값으로 함수를 전달할 수 있다.

 

 이 중첩 함수와 일급 함수의 특성을 활용한다면 아래와 같은 코드도 작성이 가능하다.

 

def html_creator(tag):
    def wrapper(msg):
        return ('<{0}>{1}</{0}>'.format(tag, msg))
    return wrapper
    
#사용

getBoldText = html_creator('b')
print( getBoldText("이것은 제목입니다") )


## 실행 결과
<b>이것은 제목입니다</b>

3. Closure function

 Closure function 은 중첩 함수에서, 중첩 함수를 선언한 외부 함수가 사라진다 하더라도, 중첩 함수와 중첩 함수로부터 받은 변수값 등을 유지할수 있도록 저장/복사하는 기법을 말한다. 위 코드블럭에서 html_creator 라는 함수를 del html_creator 로 삭제한다 하더라도, getBoldText 라는 함수에 저장한 중첩 함수와 중첩 함수를 저장할때 전달받은 'b' 라는 값을 유지된다는 소리다.

 애초에 위 코드에서 'b' 값은 html_creator 함수가 종료됨과 동시에 사라져야 마땅하지만, getBoldText 에 저장함으로써 저장된 함수를 실행했을 때 정상적으로 'b' 값이 나오는 것을 볼 수 있다.

 제공해야할 기능이 적은 경우, class 를 선언해서 사용하기보다 Closure function 을 사용한다고 한다.

반응형