다양한 프로그래밍 언어에서 퍼스트 클래스 객체(First-Class Object)란 동일한 방식으로 일관되게 다룰 수 있는 객체를 의미합니다. 퍼스트 클래스 객체는 자료 구조에 저장하거나, 다른 함수의 매개변수로 전달하거나, 제어 구조에서 활용하는 등 자유롭게 사용할 수 있습니다. 파이썬의 함수가 퍼스트 클래스 객체의 모든 속성을 지원한다면, 이를 퍼스트 클래스 함수(First-Class Function)라고 부릅니다.
퍼스트 클래스 함수의 주요 속성
- Object 타입의 인스턴스이다
- 함수를 변수에 저장할 수 있다
- 퍼스트 클래스 함수를 다른 함수의 인자(argument)로 전달할 수 있다
- 함수 안에서 다른 함수를 반환할 수 있다
- 리스트, 셋(set) 등 다양한 자료 구조에 함수를 저장할 수 있다
1. 함수를 변수에 할당하기
먼저 파이썬에서 함수가 하나의 객체처럼 사용되는 모습을 살펴보겠습니다. 파이썬에서는 함수를 변수에 할당할 수 있는데, 이때 함수를 호출하는 것이 아니라 참조를 저장하는 것이므로 괄호 ()를 붙이지 않습니다.
예제 코드
def cube(x):
return x * x * x
res = cube(5)
print(res)
my_cube = cube # my_cube은 cube 함수와 동일한 객체입니다
res = my_cube(5)
print(res)
실행 결과
125
125
my_cube = cube처럼 함수 이름 뒤에 괄호를 붙이지 않으면, 변수는 함수 자체를 참조하게 됩니다. 따라서 my_cube(5)를 호출해도 원래의 cube 함수와 동일한 결과를 얻을 수 있습니다.
2. 함수를 다른 함수의 인자로 전달하기
두 번째 속성은 함수를 다른 함수의 인자로 넘길 수 있다는 것입니다. 아래 예제에서는 cube 함수를 my_map 함수에 전달하여 리스트의 각 요소에 적용합니다.
예제 코드
def cube(x):
return x * x * x
def my_map(method, argument_list):
result = list()
for item in argument_list:
result.append(method(item))
return result
my_list = my_map(cube, [1, 2, 3, 4, 5, 6, 7, 8]) # 함수를 인자로 전달
print(my_list)
실행 결과
[1, 8, 27, 64, 125, 216, 343, 512]
이처럼 함수를 인자로 받는 함수를 고차 함수(Higher-Order Function)라고 부르며, 파이썬의 내장 함수인 map(), filter(), sorted() 등도 같은 원리로 동작합니다.
3. 함수에서 다른 함수 반환하기
세 번째 속성은 함수 안에서 새로운 함수를 정의하고 이를 반환할 수 있다는 것입니다. 아래 예제는 메시지를 출력하는 로거(logger) 함수를 생성해서 반환하는 코드입니다.
예제 코드
def create_logger(message):
def log():
print('Log Message: ' + message)
return log # 함수를 반환
my_logger = create_logger('Hello World')
my_logger()
실행 결과
Log Message: Hello World
create_logger는 내부에 정의된 log 함수를 반환하며, 반환된 함수는 외부 변수 message의 값을 기억하고 있습니다. 이러한 구조를 클로저(Closure)라고 하며, 데코레이터(decorator) 같은 고급 기법의 기반이 됩니다.
정리
파이썬의 함수는 변수에 할당하고, 인자로 전달하고, 반환값으로 사용할 수 있는 일급 시민입니다. 이러한 퍼스트 클래스 함수의 특성을 잘 활용하면 코드의 재사용성과 유연성을 크게 높일 수 있으며, 함수형 프로그래밍 스타일로 자연스럽게 나아갈 수 있습니다.