함수형 프로그래밍은 주어진 상태나 객체를 직접적으로 수정하지 않고, 순수 함수를 조합하여 소프트웨어를 만들어 나가는 프로그래밍 방식이다. 명령형 프로그래밍과는 달리, 선언형으로 '어떻게'가 아닌 '무엇'을 할 것인가를 설명하는 것에 초점을 맞추고 있다.
함수형 프로그래밍은 복잡한 상태 변화 없이 간결하게 상태를 다루기 때문에 명령형 프로그래밍보다 유지보수성과 테스트가 용이하다.
map
이나 filter
함수는 입력 배열을 변형하지 않고 새로운 배열을 반환한다.const arr = [1, 2, 3, 4];
const doubled = arr.map(x => x * 2); // [2, 4, 6, 8]
JavaScript의 함수형 프로그래밍은 주로 map
, filter
, reduce
등의 고차 함수를 활용하여 구현할 수 있다.
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(num => num % 2 === 0); // [2, 4]
여기서 filter 함수는 원본 배열을 변경하지 않고, 조건에 맞는 요소만을 담은 새 배열을 반환한다. 이렇게 공유된 상태를 변경하지 않으므로, 예측 가능성이 높아지고 디버깅이 용이하다.
Java 8이 릴리스되면서 Java에서도 함수형 프로그래밍 스타일을 지원하는 람다식과 Stream API가 추가되었다. Java의 함수형 프로그래밍은 순수함수를 사용하여 코드 모듈화를 높이는 방식으로 접근한다.
import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<String> myList = Arrays.asList("a", "b", "c", "d", "e");
// 기존 방식
for (String s : myList) {
if (s.startsWith("c")) {
System.out.println(s.toUpperCase());
}
}
// 함수형 프로그래밍 방식
myList.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
함수형 프로그래밍은 코드의 순수성과 예측 가능성을 보장하면서, 복잡한 상태 관리를 최소화할 수 있는 프로그래밍 패러다임이다. 특히, 복잡한 로직을 보다 직관적으로 처리할 수 있는 이점이 있다. 함수형 프로그래밍 스타일은 코드의 재사용성을 높이고, 결과적으로 애플리케이션의 유지보수성과 가독성을 향상시키는 데 큰 기여를 한다.