본문 바로가기

파이썬

일급 함수(First-Class Function, 퍼스트 클래스 함수)

일급 객체로서의 함수

함수형 언어를 학습하게 되면 반드시 일급 객체(First-Class Object)라는 용어를 접하게되는데, 이것은 크리스토퍼 스트래치(Christopher Strachey)라는 영국의 컴퓨터 과학자가 1960년대에 처음 사용한 개념으로 프로그램 언어 안에서 특정 종류의 객체가 일급의 지위를 가지는가에 대한 의미이다.

일급 함수(First-Class Function)의 특성

  1. 객체가 런타임에도 생성이 가능해야 한다.
  2. 인자값으로 객체를 전달할 수 있어야 한다.
  3. 반환값으로 객체를 사용할 수 있어야 한다.
  4. 변수나 데이터 구조 안에 저장할 수 있어야 한다.
  5. 할당에 사용된 이름과 관계없이 고유한 구별이 가능해야 한다.

§ 일급 함수의 특성 1 : 변수에 함수를 대입할 수 있음

함수자체를 변수에 집어넣는다는 뜻이다. 이렇게 함수가 대입된 변수는 함수처럼 실행할 수도 있고, 인자값을 받을 수도 있으며, 반환 값을 가질 수도 있다.

 

# 함수 foo는 정수를 입력받아 문자열을 출력하는 함수이다. 
def foo(integer):
    return f'결과값은 {integer+1}입니다.'

print(foo)  # 함수 foo의 주소 출력
fn = foo    # 변수 fn에 함수를 대입
print(fn)   # 변수 fn의 주소 출력
fn(5)       # 변수를 이용하여 함수 실행
<function foo at 0x0000028906367288>
<function foo at 0x0000028906367288>
'결과값은 6입니다.'

 

함수의 주소와 변수의 주소가 같다. 즉 변수도 함수처럼 사용될 수 있다는 의미이고, 실제로 변수를 함수처럼 실행시켜 보니 함수의 반환값이 나타남을 확인할 수 있다.


§ 일급 함수의 특성 2 : 함수의 반환 타입으로 함수를 사용할 수 있음

일급 객체(first-class object)로 대우받는 함수는 실행 결과로 정수, 실수, 문자열 등의 기본 자료형이나 클래스, 구조체 등의 객체를 반환할 수 있을 뿐만 아니라 함수 자체를 반환할 수도 있다.

 

# 함수 desc는 실행되면 자신의 함수 이름을 출력하는 함수이다.
def desc():  
    return f"실행된 함수는 {desc.__name__}입니다."

# 함수 passthrough는 함수 desc를 반환한다.
def passthrough():
    return desc

p1 = passthrough    # passthrough 함수의 주소를 대입
p2 = passthrough()  # passthrough 함수의 반환값을 대입

print(desc)         # desc 주소
print(passthrough)  # passthrough의 주소
print(p1)           # p1의 주소
print(p2)           # p2의 주소
print('')
print(p1())         # p1의 반환값
print(p2())         # p2의 반환값
<function desc at 0x0000028906367798>
<function passthrough at 0x00000289063678B8>
<function passthrough at 0x00000289063678B8>
<function desc at 0x0000028906367798>

<function desc at 0x0000028906367798>
실행된 함수는 desc입니다.

 

함수 desc는 자신의 함수 이름을 출력하는 함수이고, passthrough는 이런 desc 함수를 반환하는 함수이다.
p1에 passthrough 함수를 대입하였으므로 p1은 passthrough 함수와 동일한 주소를 가리킨다. 하지만, p2는 passthrough 함수의 실행 결과를 대입하였으므로 passthrough 함수의 반환값인 desc 함수의 주소를 갖게된다. 즉, p2는 desc 함수와 같은 주소를 가리킨다.
따라서 변수 p1을 함수처럼 실행시키면 passthrough 함수가 실행되므로 passthrough의 반환값인 desc 함수의 주소를 출력하고, 변수 p2를 함수처럼 실행시키면 p2가 가리키고 있는 desc 함수가 실행된다.


§ 일급 함수의 특성 3 : 함수의 인자값으로 함수를 사용할 수 있음

일급 함수는 반환값으로 함수를 사용할 수 있을 뿐만 아니라 다른 함수의 인자 값을 함수로 전달할 수 있는 특성이 있다.

 

# incr 함수는 인자를 정수로 받아 1 증가시킨 값을 반환하는 함수이다.
def incr(integer):
    return integer+1

# broker 함수는 정수와 함수를 인자로 받아, 인자로 받은 함수에 정수를 대입한 결과를 반환하는 함수이다.
def broker(integer, function):
    return function(integer)

broker(3, incr)  # 함수를 인자로 받은 경우
4

 

함수 incr은 인자로 정수를 받아 해당 정수보다 1 큰 정수값을 반환하는 함수이고, broker 함수는 정수와 함수를 인자로 받는 함수이다. broker 함수는 인자로 받은 정수를 인자로 받은 함수의 인자로 사용하여, 인자로 받은 함수의 실행 결과를 반환하는 함수이다.
broker(3, incr)의 경우 incr(3)의 실행 결과를 반환한다.

'파이썬' 카테고리의 다른 글

라즈베리파이 OS Python3를 기본으로 설정하기  (0) 2021.07.25
Qt Designer  (0) 2021.06.19
map() 함수 사용법  (0) 2021.05.11
Numpy array의 인덱싱과 슬라이싱  (0) 2021.05.11
배열의 축(axis) 이해하기  (0) 2021.05.11