함수형 프로그래밍은 함수를 일급 객체로 취급하며, 상태와 변경을 피하고 순수 함수를 중심으로 프로그램을 구성하는 패러다임입니다. 수학적 함수의 개념에 기반하여 프로그래밍을 수행하며, 주로 선언형(Declarative) 프로그래밍 스타일을 따릅니다.
함수의 일급 객체(First-Class Citizien)
const add = (a, b) => a + b;
const apply = (func, x, y) => func(x, y);
console.log(apply(add, 2, 3)); // 5
순수 함수(Pure Function)
let counter = 0;
function increment() {
counter += 1; // 외부 변수 counter를 직접 변경
return counter;
}
console.log(increment()); // 1
console.log(increment()); // 2
순수 함수
function increment(counter) {
return counter + 1; // 외부 상태를 변경하지 않고, 새로운 값을 반환
}
let counter = 0;
console.log(increment(counter)); // 1
console.log(increment(counter)); // 1 (외부 상태는 변하지 않음)
counter = increment(counter); // 새로운 값을 외부에서 할당
console.log(counter); // 1
순수 함수를 사용하는 이유는
함수형 프로그래밍은 불변성(Immutability)를 띕니다.
고차 함수(Higher-order Function)
const numbers = [1, 2, 3, 4];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6, 8]
console.log(doubled);
선언형 프로그래밍(Declarative Programming)
const numbers = [1, 2, 3, 4, 5];
const evens = [];
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) {
evens.push(numbers[i]); // 조건에 맞는 값을 추가
}
}
console.log(evens); // [2, 4]
선언형 프로그래밍(Declarative Programming)
const numbers = [1, 2, 3, 4, 5];
const evens = numbers.filter((n) => n % 2 === 0);
console.log(evens); // [2, 4]
함수형 프로그래밍은 지연 계산(Lazy Evaluation)을 사용
이러한 함수형 프로그래밍을 왜 사용하는가?
함수형 프로그래밍(Functional Programming)은 순수 함수, 불변성, 고차 함수를 기반으로 프로그램을 작성하며, 상태와 변경을 최소화하여 코드의 예측 가능성과 테스트 가능성을 높이는 프로그래밍 패러다임입니다.
백엔드 개발자로 취업을 준비하며 함수형 프로그래밍을 실습할 수 있는 여러 가지 방법이 있습니다. 실습을 통해 함수형 프로그래밍의 원칙과 이를 백엔드 개발에 적용하는 방법을 익힐 수 있습니다.
Java 8부터 도입된 Stream API는 함수형 프로그래밍의 핵심 요소를 제공합니다. 데이터를 처리하는 데 함수형 스타일(filter, map, reduce)을 사용할 수 있습니다.
실습 과제:
flatMap)import java.util.Arrays;
import java.util.List;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 짝수만 필터링 후 두 배로 변환
numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.forEach(System.out::println);
}
}
Optional을 이용한 Null 처리Optional은 함수형 프로그래밍에서 흔히 사용하는 모나드(Monad) 개념을 Java에 구현한 것으로, NullPointerException을 방지하는 데 유용합니다.
실습 과제:
Optional 사용import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = Optional.ofNullable(null);
// 값이 있으면 출력, 없으면 기본값 사용
String result = name.orElse("Default Name");
System.out.println(result);
}
}
Java의 람다식과 FunctionalInterface는 함수형 프로그래밍을 위한 기본 도구입니다. 이를 활용해 코드 간소화와 가독성 향상을 실습합니다.
실습 과제:
FunctionalInterface를 만들어 활용compose, andThen) 실습import java.util.function.Function;
public class LambdaExample {
public static void main(String[] args) {
Function<Integer, Integer> multiplyByTwo = x -> x * 2;
Function<Integer, Integer> addThree = x -> x + 3;
// 함수 조합
Function<Integer, Integer> combined = multiplyByTwo.andThen(addThree);
System.out.println(combined.apply(5)); // 13
}
}
Spring WebFlux는 함수형 프로그래밍 스타일을 적극적으로 활용합니다. Mono, Flux와 같은 Reactor 라이브러리를 사용하면 비동기 및 리액티브 프로그래밍 실습이 가능합니다.
실습 과제:
Flux를 사용한 데이터 스트림 처리import reactor.core.publisher.Flux;
public class WebFluxExample {
public static void main(String[] args) {
Flux.just(1, 2, 3, 4)
.filter(n -> n % 2 == 0)
.map(n -> n * 2)
.subscribe(System.out::println); // 4, 8
}
}
같은 기능을 명령형 방식과 함수형 방식으로 작성하고, 차이를 비교해 보는 것도 실습에 유용합니다.
실습 과제:
로그 분석기
Collectors를 활용.도서 관리 API
Flux로 처리.채팅 서비스
단계별로 진행
깃허브(GitHub)에 코드 공유
토이 프로젝트 진행
온라인 플랫폼 활용
실습을 통해 작성한 프로젝트와 코드를 인터뷰나 자기소개서에서 잘 표현하면 함수형 프로그래밍을 실무에 적용할 준비가 된 신입 개발자로 어필할 수 있습니다.