🖇 객체란?
🖇 일급 객체(First-Class Object)란?
🖇 일급 객체 함수의 활용: 고차 함수
프로그래밍을 배우다 보면 '일급 객체(First-Class Object)'라는 개념을 접하게 된다.
이 개념은 특히 파이썬처럼 객체 지향 언어에서 매우 중요한데,
이 글에서는
일급 객체를 제대로 이해하기 위해 먼저 객체와 객체 지향 프로그래밍(OOP)을 살펴보고, 파이썬 함수가 왜 일급 객체인지까지 예제를 통해 정리해 보았다.
객체(Object)는 속성(변수)과 행동(함수)을 가진 독립적인 존재이다.
객체는 컴퓨터 세상뿐만 아니라 우리 주변에서도 적용할 수 있는 개념이다.
e.g., 객체(자동차) = 속성(색상, 브랜드, 속도) + 행동(달리기, 멈추기)
파이썬은 객체 지향 언어로, 모든 것이 객체이다.
변수도, 함수도, 숫자도, 문자열도 모두 객체이다.
프로그램의 구성 요소들을 객체로 표현하고,
각 객체 간의 상호작용으로 구성된 프로그래밍 방식이다.
절차 지향 vs 객체 지향
절차 지향 프로그래밍
: 연산이 순차적으로 진행되는 프로시저(procedure)를 기반으로 하는 프로그래밍 방법
| 절차 지향 | 객체 지향 |
|---|---|
| 순차적인 흐름 | 객체 중심 구조 |
| 데이터와 함수가 분리됨 | 데이터와 행동을 객체에 묶음 |
| 작은 변화에도 전체 수정 | 독립적인 단위로 유지보수 쉬움 |
일급 객체란,
객체 지향 프로그래밍에서 사용되는 개념 중 하나로
다른 객체들에 일반적으로 적용할 수 있는 연산을 모두 지원하는 객체이다. 여기서 연산이란 연산자로 수행할 수 있는 연산뿐만 아니라 인자로 넘기기, 비교하기, 수정하기, 변수에 대입하기 등을 의미한다.
더 구체적으로 보면
다음 조건을 모두 만족하는 객체를 말한다.
- 변수에 할당하거나 자료구조(리스트, 딕셔너리 등)에 담을 수 있다.
- 매개변수로 전달할 수 있다.
- 리터값으로 사용할 수 있다.
숫자(int)로 살펴보자.
x = 3 # 1. 변수에 할당
nums = [1, 2, 3] # 2. 리스트에 담기
def add(a): # 3. 매개변수로 전달
return a + 1
print(add(x)) # 4. 리턴값으로 사용
이렇게
숫자는 3가지 조건을 모두 만족하기 때문에 일급 객체라고 할 수 있다.
우리가 잘 알고 있는 int, float, str 타입의 객체는 일급 객체이다.
함수도 일급 객체일까?
결론부터 말하자면, 파이썬의 함수는 일급 객체이다.
아래 예제로 조건을 하나씩 확인해 보자.
def add(a, b):
return a + b
f = add
print(f(2, 3)) # [결과] 5
def sub(a, b):
return a - b
operations = [add, sub]
for op in operations:
print(op(5, 2)) # [결과] 7, 3
def apply(func, a, b):
return func(a, b)
print(apply(add, 10, 5)) # [결과] 15
def greeting(name):
def say_hello():
print(f"Hello, {name}!")
return say_hello
hello_func = greeting("AIFFEL")
hello_func() # [결과] Hello, AIFFEL!
이처럼 함수도 할당, 전달, 리턴이 가능하므로
파이썬에서는 함수 자체가 데이터처럼 자유롭게 사용된다.
함수를 변수처럼 자유롭게 다룰 수 있다는 것이 파이썬의 유연성과 확장성의 핵심이라고 할 수 있다.
일급 객체로서의 함수는
고차 함수(Higher-order Function)를 가능하게 한다.
고차 함수란?
함수를 인자로 받거나, 함수를 반환하는 함수를 말합니다.
즉, 함수를 매개변수처럼 다루거나, 함수 안에서 새로운 함수를 만들어 리턴하는 것이다.
이러한 동작이 가능하려면 함수도 데이터처럼 다룰 수 있어야 하는데
이걸 가능하게 해주는 개념이 일급 객체이다.
대표적인 고차 함수 예시
map(function, iterable)filter(function, iterable)sorted(list, key=function)# 홀수만 필터링
nums = range(10)
def is_odd(x):
return x % 2 == 1
print(list(filter(is_odd, nums))) # [결과] [1, 3, 5, 7, 9]
고차 함수와 같은 함수형 프로그래밍이 가능한 것은
파이썬은 함수를 변수처럼 자유롭게 다룰 수 있게 해주는 일급 객체 특성을 갖고 있기 때문이다.
덕분에 코드를 더 간결하게 구성하고, 반복을 줄이며 재사용성을 높여
직관적이고 효율적인 프로그래밍이 가능해진다 :)