OOP는 가변 상태와 동작을 묶는 객체를 중심으로 코드를 구성합니다. **함수형 프로그래밍(FP)**은 순수 함수와 불변 데이터를 중심으로 코드를 구성하며, 계산을 데이터 변환으로 취급합니다. 둘은 반대가 아니라 서로 다른 기본 성향이며 — 대부분의 최신 언어는 둘을 섞습니다.
OOP는 가변 상태와 동작을 묶는 객체를 중심으로 코드를 구성합니다. **함수형 프로그래밍(FP)**은 순수 함수와 불변 데이터를 중심으로 코드를 구성하며, 계산을 데이터 변환으로 취급합니다. 둘은 반대가 아니라 서로 다른 기본 성향이며 — 대부분의 최신 언어는 둘을 섞습니다.
| OOP | FP |
|---|
| 단위 | 객체 (상태 + 메서드) | 함수 |
| 상태 | 캡슐화됨, 흔히 가변 | 불변; 부작용 회피 |
| Polymorphism | 서브타이핑 / 동적 디스패치 | 고차 함수, generics |
| 타입 추가 | 쉬움 (새 class) | 어려움 (모든 함수를 건드림) |
| 연산 추가 | 어려움 (모든 class를 건드림) | 쉬움 (새 함수) |
마지막 행이 **표현 문제(expression problem)**입니다: 각 패러다임은 한 변화 축은 쉽게, 다른 축은 어렵게 만듭니다.
# OOP: 데이터 + 동작이 함께, 타입으로 디스패치
class Circle:
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# FP: 데이터는 단순; 동작은 별도의 순수 함수
def area(shape):
match shape:
case ("circle", r): return 3.14159 * r ** 2
case ("square", s): return s * s
OOP → 정체성과 생명주기가 있는 풍부한 도메인 (주문, 세션, UI 위젯)
FP → 데이터 파이프라인, 변환, 동시성 (불변성이 경쟁 상태를 회피)
최신 언어는 다중 패러다임(Scala, Kotlin, Python, 최신 Java/C#)이므로, 실용적인 기술은 부족을 고르는 것이 아니라 문제마다 올바른 도구를 선택하는 것입니다.
FP의 불변성과 순수 함수에 대한 강조는 OOP 모범 사례를 재편했습니다 — 불변 값 객체와 동작의 의존성 주입은 이제 좋은 OO 설계에서 표준이 된 FP 아이디어입니다.