객체 지향과 함수형 중 어느 쪽을 선택할지는 철학적 논쟁이 아니라 복잡성, 상태 관리, 동시성 요구를 어떻게 해결할지에 대한 실무적 판단입니다. 이 글은 두 패러다임의 핵심 차이와 실무 적용 사례를 비교해 프로젝트에 맞는 결정을 돕습니다.
December 1, 2025 (8mo ago) — last updated May 15, 2026 (3mo ago)
OOP vs 함수형 프로그래밍: 실무 개발자 가이드
OOP와 함수형의 장단점, 적용 사례와 판단 기준을 비교해 실무에서 올바른 선택을 돕는 간결한 가이드입니다.
← Back to blog
OOP vs 함수형 프로그래밍: 실무 개발자 가이드
요약: OOP와 함수형의 장단점, 실무 적용 사례와 선택 기준을 비교해 프로젝트 요구에 맞는 판단을 돕습니다.
소개
객체 지향 프로그래밍과 함수형 프로그래밍 중 어느 쪽을 선택할지는 철학의 문제가 아니라 복잡성, 상태 관리, 데이터 흐름을 어떻게 다루고 싶은지에 대한 실용적 판단입니다. 이 가이드는 두 패러다임의 핵심 차이와 실무에서의 트레이드오프를 비교하고, 언제 각 접근법이 빛을 발하는지 구체적 예제와 함께 설명합니다.
패러다임이 복잡성과 상태를 다루는 방식
객체 지향 프로그래밍(OOP)은 데이터와 그 데이터에 작용하는 동작을 객체로 묶어 캡슐화합니다. 예를 들어, Car 객체는 colour, currentSpeed 같은 속성과 상태를 변경하는 accelerate()나 brake() 같은 메서드를 가집니다.
함수형 프로그래밍(FP)은 계산을 순수 함수의 조합으로 보고 부수 효과를 피하며 불변성을 강조합니다. 데이터는 수정되는 대신 새 복사본으로 반환되어 공유 상태로 인한 버그를 줄입니다.
패러다임 이해하기

어떤 패러다임을 택하느냐는 아키텍처와 사고 모델에 직접적인 영향을 줍니다. OOP에서 FP로 전환한다는 것은 상태ful 객체 중심의 사고에서, 합성 가능한 상태 없는 변환 중심의 사고로 바뀐다는 의미입니다.
핵심 비교
| 항목 | 객체 지향 프로그래밍 (OOP) | 함수형 프로그래밍 (FP) |
|---|---|---|
| 주요 단위 | 데이터와 동작을 결합한 객체 | 데이터를 변환하는 순수 함수 |
| 상태 관리 | 가변 상태를 캡슐화하여 관리 | 불변성을 통해 부수 효과 회피 |
| 데이터 흐름 | 메서드가 내부 상태를 수정 | 함수 체인을 통해 데이터 흐름 |
| 재사용 | 상속 또는 객체 조합 | 소규모 함수의 합성 |
핵심 개념 차이
OOP는 현실 세계의 엔티티를 상태와 행위로 모델링하는 데 직관적입니다(예: GUI 위젯, 게임 객체). 반면 FP는 불변성과 순수 함수를 통해 예측 가능성과 테스트 용이성을 제공합니다. 불변성은 동시성 환경에서 특히 유리합니다.
상태: 가변 vs 불변
OOP에서는 user.setEmail('new@example.com')처럼 객체 상태를 직접 변경합니다. FP에서는 updateEmail(user, 'new@example.com') 같은 함수를 사용해 새 사용자 객체를 반환합니다. 불변성은 공유된 상태로 인한 예상치 못한 변화를 줄입니다.
로직 구성: 메서드 vs 순수 함수
OOP는 데이터와 로직을 객체 내에 함께 묶습니다. FP는 데이터를 변환하는 순수 함수로 로직을 구성해 입력과 출력이 명확합니다. 이로 인해 단위 테스트가 단순해지고 숨겨진 상태를 걱정할 필요가 줄어듭니다.
재사용: 상속 vs 구성
상속은 동작 공유에 유용하지만 복잡한 계층을 만들기 쉽습니다. FP는 작은 함수들을 합성해 복잡한 동작을 만들므로 리팩터링과 재사용성이 높습니다.
유지보수성과 장기적 영향
둘 중 어느 패러다임이 더 우수한지는 맥락과 팀 규율에 달려 있습니다. OOP의 캡슐화는 복잡도를 관리하는 데 도움을 주지만, 잘못된 객체 설계는 디버깅을 어렵게 만듭니다. FP의 불변성은 버그 표면을 좁히고 동시성 문제를 단순화합니다. 업계 분석은 함수형 기법 채택이 증가하고 있음을 보고하고 있지만, 전반적인 품질은 테스트와 코드 리뷰 같은 공학적 규율에 더 크게 좌우됩니다1.
압박 상황에서의 동작 비교
| 관심사 | OOP | FP |
|---|---|---|
| 디버깅 | 객체 간 상태 추적 필요 | 입력과 출력 범위로 좁아짐 |
| 동시성 | 공유 상태 조정 필요 | 불변성으로 더 안전함 |
| 리팩터링 | 깊은 상속 구조에서 어려움 | 함수 교체로 쉬움 |
| 인지 부하 | 상태ful 객체가 많으면 증가 | 개별 함수를 독립적으로 이해 가능 |
함수형 기법이 동시성과 병렬성을 단순화해 대규모 시스템에서의 채택이 늘고 있다는 점은 여러 업계 보고서가 지적합니다1.
올바른 도구 선택하기

최선의 선택은 프로젝트 요구사항, 팀의 숙련도, 장기 목표에 따라 달라집니다. 일반적 권장 사항:
OOP가 적합한 경우
• GUI나 위젯이 자연스럽게 객체에 매핑되는 애플리케이션.
• 상태와 동작을 캡슐화하는 게임 개발.
• 고객, 주문 등 엔터프라이즈 도메인 모델을 명확히 표현해야 하는 시스템.
FP가 적합한 경우
• 데이터 파이프라인이나 ETL처럼 단계별 변환이 핵심인 경우.
• 이벤트 스트림 처리나 마이크로서비스 간 메시지 처리 같이 공유 가변 상태를 피해야 하는 시스템.
• 동시성과 병렬 처리에서 불변성이 이점을 제공할 때.
JavaScript 실용 예제
일반적인 작업: 활성 사용자를 필터링하고 이름을 대문자로 변환하기.
OOP 접근(인스턴스 상태 변경):
class UserList {
constructor(users) {
this.users = users;
}
filterActive() {
this.users = this.users.filter(u => u.isActive);
return this;
}
capitalizeNames() {
this.users.forEach(u => {
u.name = u.name.toUpperCase();
});
return this;
}
}
const userList = new UserList([
{ name: 'Alice', isActive: true },
{ name: 'Bob', isActive: false }
]);
userList.filterActive().capitalizeNames();
// userList.users is [{ name: 'ALICE', isActive: true }]
FP 접근(불변성 유지):
const isActive = user => user.isActive;
const capitalizeName = user => ({ ...user, name: user.name.toUpperCase() });
const processUsers = (users) => {
return users
.filter(isActive)
.map(capitalizeName);
};
const users = [
{ name: 'Alice', isActive: true },
{ name: 'Bob', isActive: false }
];
const processedUsers = processUsers(users);
// processedUsers is [{ name: 'ALICE', isActive: true }]
// original users array is unchanged
FP 버전은 숨겨진 변경과 부수 효과를 피하기 때문에 테스트하기 더 쉽고 예측 가능성이 높습니다.
코드 품질과 버그
순수 함수와 불변성 같은 함수형 패턴은 특정 유형의 버그를 줄여주지만 패러다임만으로 모든 문제를 해결하진 않습니다. 연구는 패러다임 간 버그 비율 차이가 크게 크지 않음을 보여주며, 견고한 테스트와 코드 리뷰, 좋은 아키텍처가 더 결정적인 영향을 미친다는 점을 강조합니다2.
팀과 프로세스 선택 기준
실용적인 접근이 일반적으로 가장 효과적입니다. 많은 팀이 상위 아키텍처에는 OOP를, 비즈니스 로직과 데이터 변환에는 FP 기법을 사용하는 하이브리드 전략을 채택합니다. 주요 결정 기준은 다음과 같습니다:
• 팀 숙련도: 팀이 가장 잘 아는 방식을 우선하세요.
• 문제 도메인: 상태ful 엔티티를 모델링하나요, 아니면 데이터 변환이 주된 작업인가요?
• 동시성 요구: 불변성의 혜택을 받는가?
• 생태계와 도구: 사용 언어가 해당 패러다임을 잘 지원하는가?
예: 테스트 주도 개발(TDD)은 어떤 패러다임을 쓰든 코드 품질을 개선합니다. 자세한 가이드는 내부 가이드에서 확인하세요: TDD 가이드.
자주 묻는 질문
OOP와 FP를 혼합할 수 있나요?
네. JavaScript, TypeScript, Python 등은 다중 패러다임을 지원합니다. 구조에는 OOP를 사용하고, 순수하고 테스트 가능한 비즈니스 로직에는 FP를 적용하세요.
초보자는 무엇부터 배워야 하나요?
프로젝트에 빨리 적용할 수 있는 패러다임부터 시작하되 둘 다 익히세요. 각각의 개념은 개발자로서의 사고를 넓혀 줍니다. 입문 후에는 함수형 프로그래밍 태그나 관련 가이드를 참고하세요.
어느 접근법이 버그를 더 줄이나요?
패러다임 자체보다는 테스트, 코드 리뷰, 아키텍처가 더 큰 영향을 미칩니다. 규율 있는 공학 관행이 가장 중요합니다3.
간단 Q&A — 핵심 요약
Q: OOP와 FP의 가장 큰 차이점은 무엇인가요?
A: 상태를 다루는 방식입니다. OOP는 가변 상태와 캡슐화를, FP는 불변성과 순수 함수를 강조합니다.
Q: 언제 FP를 선택해야 하나요?
A: 데이터 파이프라인, 이벤트 스트림 처리, 동시성 요구가 높은 시스템에서 FP가 더 유리합니다.
Q: 패러다임 혼합이 유효한가요?
A: 네. 구조는 OOP, 비즈니스 로직과 데이터 변환은 FP를 사용하는 하이브리드가 실무에서 흔히 효과적입니다.
AI가 코드를 작성합니다.당신이 그것을 지속시킵니다.
AI 가속 시대에 클린 코드는 단순히 좋은 관행이 아닙니다 — 확장되는 시스템과 자체 무게로 붕괴되는 코드베이스의 차이입니다.