728x90
함수형 프로그래밍(Functional Programming)은 프로그래밍 패러다임 중 하나로,
프로그램을 수학적 함수의 조합으로 표현하고 **상태 변화와 부수 효과(Side Effect)**를 최소화하는 것을 목표로 합니다.
이 패러다임은 순수 함수를 기반으로 하며, 데이터를 변형하거나 상태를 변경하지 않고 결과를 도출하는 데 초점을 둡니다.
핵심 개념
- 순수 함수(Pure Function)
- 동일한 입력에 대해 항상 동일한 출력을 반환하는 함수입니다.
- 외부 상태를 변경하지 않고 부수 효과(Side Effect)가 없습니다.
- 예:
// 순수 함수의 예 const add = (a, b) => a + b; console.log(add(2, 3)); // 항상 5 반환
- 불변성(Immutability)
- 데이터는 변경되지 않고, 변경이 필요한 경우 기존 데이터를 복사하여 새로운 데이터를 생성합니다.
- 예:
const numbers = [1, 2, 3]; const newNumbers = [...numbers, 4]; // 기존 배열은 변경되지 않음
- 고차 함수(Higher-Order Function)
- 함수를 인자로 전달하거나 반환할 수 있는 함수입니다.
- 예:
const applyFunction = (fn, value) => fn(value); const double = x => x * 2; console.log(applyFunction(double, 5)); // 10
- 일급 객체(First-Class Citizen)
- 함수가 변수처럼 사용되며, 다른 함수의 인자로 전달되거나 반환값으로 사용할 수 있습니다.
- 함수는 값처럼 취급됩니다.
- 선언형 프로그래밍(Declarative Programming)
- **어떻게(How)**가 아닌 무엇을(What) 수행할지에 집중합니다.
- 예:
// 명령형 (Imperative) let sum = 0; for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; } // 선언형 (Declarative) const sum = numbers.reduce((acc, curr) => acc + curr, 0);
- 지연 평가(Lazy Evaluation)
- 필요할 때만 계산을 수행합니다. 이는 성능 최적화에 유리합니다.
- 예: JavaScript의 map, filter 등은 체인을 형성한 후 최종 평가 시 수행됩니다.
장점
- 가독성: 코드가 간결하고 명확하며, 유지보수가 용이합니다.
- 병렬 처리에 유리: 상태 변화가 없으므로, 병렬 처리와 동시성 문제가 적습니다.
- 테스트 용이성: 순수 함수는 독립적이기 때문에 테스트하기 쉽습니다.
- 버그 감소: 부수 효과가 없기 때문에 코드 오류를 줄일 수 있습니다.
단점
- 학습 곡선: 기존 명령형 프로그래밍에 익숙한 개발자에게는 다소 어렵게 느껴질 수 있습니다.
- 성능 문제: 불변성 때문에 데이터를 복사해야 하므로 메모리 사용량이 증가할 수 있습니다.
- 디버깅: 함수 체인이 길어지면 디버깅이 복잡해질 수 있습니다.
대표 언어
- 함수형 프로그래밍을 지원하는 언어:
- JavaScript (ex: map, reduce, filter)
- Python (ex: lambda, map, filter)
- Scala
- Haskell (순수 함수형 언어)
- Clojure
- Elixir
예제: JavaScript에서의 함수형 프로그래밍
const numbers = [1, 2, 3, 4, 5];
// 순수 함수 사용
const double = x => x * 2;
// 고차 함수 활용 (map, filter, reduce)
const result = numbers
.map(double) // [2, 4, 6, 8, 10]
.filter(x => x > 5) // [6, 8, 10]
.reduce((sum, x) => sum + x, 0); // 24
console.log(result); // 24
질문
- 그럼 성능적으로 장단점
- // 명령형 (Imperative)
let sum = 0;
for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; }
// 선언형 (Declarative)
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
각각 명령형과 선언형인데 함수를 만들어서 명령형을 사용하는거랑 무슨차이야?
명령형과 선언형 차이[성능_예시]
1. 성능 차이의 주요 요인명령형 스타일직접적인 상태 변경과 제어를 통해 CPU와 메모리 사용을 최적화할 수 있음.루프를 명시적으로 작성하므로, 추가적인 함수 호출 및 클로저 생성이 없어 오
raconer.tistory.com
명령형과 선언형 차이[이론]
1. 명령형 스타일에서 함수를 사용하는 경우명령형 스타일은 **"어떻게 수행할지(how)"**를 세부적으로 명시합니다. 함수로 분리하여 코드를 더 읽기 쉽게 만들 수도 있지만, 여전히 실행 순서와
raconer.tistory.com
728x90
'BackEnd' 카테고리의 다른 글
명령형과 선언형 차이[이론] (0) | 2025.01.19 |
---|---|
함수형 프로그래밍의 장단점 (0) | 2025.01.19 |
헥사고날 아키텍처(Hexagonal Architecture)_ 추가 수정 필요 (0) | 2024.08.27 |
멀티 스레드 환경에 대한 이해 (0) | 2024.02.05 |
Timline 읽어오는법 ( pull/push Model ) (0) | 2024.02.03 |