Lang/Python

[Python] First-Class Function (일급 함수)

Henu 2021. 12. 2. 15:45

프로그래밍 언어가 함수를 일급 객체로 취급하는 경우 일급 함수를 지원한다고 한다.

Python 은 일급 함수를 지원한다.

(Java의 함수는 1급 객체가 아니다. Kotlin의 함수는 1급 객체라고 한다.)

 

일급 객체(First-Class Citizen)란?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.

1. 변수나 데이터 구조에 할당할 수 있다.
2. 객체의 인자로 넘길 수 있다.
3. 객체의 리턴 값으로 리턴이 가능해야 한다.

위 3가지 조건을 만족하면 1급객체라고 할 수 있다.

 

 

일급 함수의 속성

  • 함수는 Object 유형의 인스턴스이다.
  • 함수를 변수에 저장할 수 있다.
  • 함수를 다른 함수에 매개변수로 전달할 수 있다.
  • 함수에서 함수를 반환할 수 있다.
  • List, HashTable 같은 데이터구조에 저장할 수 있다.

 

 

1. 함수는 객체이다.

Python 함수는 일급 객체이다.

아래 코드에서는 a변수에 함수를 할당한다. 이러한 할당 자체로는 함수를 호출하지 않는다.

a는 startOrder 함수가 참조하는 함수 객체를 가져와서 이를 가리키는 새로운 함수를 만든다.

msglist = [
    "Select One",
]

def startOrder(message):
    return message

print(startOrder(msglist[0]))

a = startOrder

print(a(msglist[0]))

 

 

2. 함수는 다른 함수에 인수로 전달할 수 있다.

함수는 객체이기 때문에 다른 함수에 인수로 전달할 수 있다.

다른 함수를 인수로 받아들일 수 있는 함수고차 함수라고도 한다.

아래 코드에서 함수를 인수로 사용하는 welcome함수를 만들었다.

def showMenu(m):
    return m

def showMenuDouble(m):
    return m + " " + m

def welcome(func, msg):
    show = func(msg)    
    print(show)

welcome(showMenu, "Ice tea")
welcome(showMenuDouble, "Ice tea")

 

 

3. 함수는 다른 함수를 반환할 수 있다.

함수는 객체이기 때문에 다른 함수에서 함수를 반환 할 수 있다. 

아래 코드의 create_calc는 자신의 내부에서 만들어진 calc함수를 반환한다.

내부에서 만든 calc 함수는 중첩함수 라고 하며, 자신의 바깥에 있는 create_calc의 지역 변수에 접근할 수 있다.

def add(x, y):
    return x + y

def mul(x, y):
    return x * y

def create_calc(func, x):
    offset = 20
    def calc(y):
        y += offset
        return func(x, y)
    return calc

newadder = create_calc(add, 15)
newmuler = create_calc(mul, 10)
print(newadder(20)) # 55
print(newmuler(15)) # 350

 

위 코드는 데코레이터의 개념이 살짝 들어간 코드이며 이번 포스팅에서 설명한 '1. 함수는 객체이다', '2. 함수는 다른 함수의 인자로 전달할 수 있다' 에 대한 개념을 모두 담고 있다.

 

 

 

next : closure

 

[Python] Closure (클로저)

클로저를 이해하기 위해서는 일급 함수, 일급 객체에 대한 이해가 필요하다. 만약 일급함수, 일급객체를 모른다면 아래 포스팅이 도움이 될 수 있다. [Python] First-Class Function (일급 함수) 프로그래

hyeo-noo.tistory.com