함수형 프로그래밍은 제가 배운 개발 이론 중 가장 혁신적이었어요
왜냐하면, 새로운 관점의 사고방식을 제시하기 때문인데요
가령, '객체지향 프로그래밍'은 데이터를 중심으로 사고한다면
'함수형 프로그래밍'은 함수를 중심으로 사고하거든요
다양한 사고방식을 알면, 문제를 보다 유연한 방식으로 해결할 수 있어요
함수형 프로그래밍은 앞으로 여러 주제로 연재할 예정이며,
가장 먼저는 함수형 프로그래밍의 개념에 대해 알아볼게요
함수형 프로그래밍 (FP)
함수형 프로그래밍은 '순수 함수를 통해 상태 변화나 부수 효과를 최소화하는 프로그래밍 기법'이에요
함수형 프로그래밍을 이해하기 위해선 아래 개념들을 알 필요가 있구요
- 선언형 프로그래밍
- 순수 함수
- 부수 효과
- 참조 투명성
- 불변성
- 1급 객체
- ...
1️⃣ 선언형 프로그래밍
함수형 프로그래밍은 선언형 프로그래밍의 한 종류로 볼 수 있어요
선언형 프로그래밍은 '내부 로직을 숨기고, 선언을 통해 문제를 해결'해요
함수형 프로그래밍도 '내부 로직을 숨기고, 순수 함수를 통해 문제를 해결'하구요
'어떻게 할 것인지(How)'가 아닌 '무엇을 할 것인지(What)'에 집중하는 기법이죠
그래서 코드를 통해 의도를 쉽게 파악할 수 있지만, 동작 방식은 파악하기 어려워요
// 선언형 프로그래밍
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, current) => accumulator + current, 0);
💡 명령형 프로그래밍
이와 비교되는 개념은 명령형 프로그래밍이에요
명령형 프로그래밍은 '컴퓨터가 실행할 명령들을 순차적으로 구현'해요
'무엇을 할 것인지(What)'가 아닌 '어떻게 할 것인지(How)'에 집중하는 기법이죠
그래서 코드를 통해 동작 방식을 쉽게 파악할 수 있지만, 의도는 파악하기 어려워요
// 명령형 프로그래밍
const numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
2️⃣ 순수 함수
순수 함수(Pure Function)는,
'동일한 입력에 대해 동일한 결과를 반환하고, 외부 상태를 변경하지 않는 함수'에요
한 마디로 '부수 효과가 없는 함수'라 말할 수 있죠
그렇다면 부수 효과는 무엇일까요?
💡 부수 효과
부수 효과(Side Effect)는 '어떤 로직이 함수 외부에 영향을 주는 것'을 의미해요
부수 효과가 많으면 코드는 아래와 같은 문제들이 생길 수 있어요
- 예상치 못한 외부의 변화로 인해 버그가 발생
- 함수의 영향 범위를 파악하기 어려워 유지보수 힘듦
- 함수를 분리하기 어려워 테스트 힘듦
- 함수의 실행 결과가 매번 달라질 수 있음
- 동시에 함수를 실행할 때, 예상치 못한 데이터 충돌이 생길 수 있음
- ...
부수 효과의 예시는 아래와 같아요
- 전역 변수 변경
- 파일 입출력
- 시간 또는 랜덤한 값에 의존
- ...
함수형 프로그래밍은 '순수 함수'를 통해 부수 효과를 제거해요
덕분에 예측하기 쉽고, 관리하기 쉬운 안전한 코드를 작성할 수 있죠
3️⃣ 참조 투명성
참조 투명성은 '동일한 입력에 대해 항상 동일한 결과를 반환하는 것'을 의미해요
왠지 '순수 함수의 정의'에서 봤던 낯익은 문장이 보이죠?
맞아요! '순수 함수'는 '참조 투명성'을 갖는 특징이 있어요
4️⃣ 불변성
불변성은 '한 번 생성된 데이터는 변경 불가능한 것'을 의미해요
순수 함수는 데이터를 변경하는 대신 '새로운 데이터를 생성하는 방식'으로 '불변성'을 지켜요
그래야만 '순수 함수'는 '부수 효과' 없이 '참조 투명성'을 유지할 수 있거든요
5️⃣ 1급 객체
함수형 프로그래밍에서 함수는 '1급 객체'의 조건을 갖춰야 돼요
그래야만 함수를 '값'으로 다룰 수 있게 되거든요
다행히 JavaScript의 함수는 '1급 객체'의 조건을 모두 만족해요
'1급 객체'의 조건은 아래와 같아요
- 함수를 변수에 할당할 수 있어야 함
- 함수를 다른 함수의 인수로 전달할 수 있어야 함
- 함수를 다른 함수의 반환값으로 사용할 수 있어야 함
'1급 객체'인 함수는 아래와 같이 활용할 수 있어요
- 익명 함수
- 콜백 함수
- 고차 함수
- 클로저
- 커링
- ...
작성하고 보니 원론적인 글이 되어버렸네요 😂
사실 저는 함수형 프로그래밍의 이론보단 사고방식을 강조하고 싶어요
실무에선 다양한 함수형 프로그래밍 테크닉을 구사하는 것보다도
기존의 컨벤션과 코드 스타일을 유지하는 것이 훨씬 중요하거든요!
그런 의미로, "쏙쏙 들어오는 함수형 코딩" 책을 강력 추천해요
저의 사고방식을 크게 바꿔준 책이자, 제 코드에 큰 변화를 준 책이거든요
여러분들도 함수형 프로그래밍에 같이 입덕해보시죠 😎