함수형 프로그래밍

MONA·2025년 3월 24일

나혼공

목록 보기
61/92

함수형 프로그래밍(Functional Programming)

함수를 일급 객체로 다루고, 상태 변경 없이(불변성), 순수 함수들을 조합해 프로그램을 만드는 프로그래밍 패러다임
순수 함수와 불변성을 기반으로 부작용 없는 함수들을 조합해 프로그램을 만드는 방식

기존에는 "어떻게 할 지(How)" 하나하나 명령을 작성했다면, 함수형은 "무엇을 할 지(What)" 함수 중심으로 간결하게 표현함

주요 개념

순수 함수 (Pure Function)

  • 동일 입력에 대해 항상 동일한 출력을 내는 함수
  • 외부 상태나 전역변수에 의존하지 않음
  • 부작용(side effect)이 없음
  • 순수 함수로 함수 합성이 이루어진다

불변성 (Immutability)

  • 데이터는 한 번 만들어지면 변경하지 않고, 변경이 필요할 때는 새로운 값을 반환함

일급성 (First-Class Function)

  • 함수 자체를 값처럼 취급할 수 있다
    • 변수에 할당
    • 함수의 인자로 전달
    • 함수의 반환값으로 사용

고차 함수 (Higher-Order Function)

  • 함수를 인자로 받거나 함수를 반환하는 함수

선언형 프로그래밍

  • 어떻게 보다는 무엇을 에 집중함
  • 루프보다는 map, filter, reduce 같은 함수 사용

장단점

장점

  • 버그 발생 가능성 감소(부작용을 줄임)
  • 테스트가 쉬움
  • 병렬처리/멀티스레딩에 강함(상태 공유가 없음)
  • 코드 재사용성, 예측 가능성 증가

단점

  • 러닝커브?
  • 모든 상황에 적합하지는 않음
  • 불변성 유지에 따른 성능 이슈가 있을 수 있음(GC, 메모리)

예시

1. 짝수만 골라 제곱한 리스트 반환하기

명령형 방식

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> result = new ArrayList<>();

for(int n: numbers) {
	if (n%2 == 0) {
    	result.add(n*n);
    }
}

System.out.println(result); // [4, 16]

함수형 방식

List<Integer> numbers = List.of(1, 2, 3, 4, 5);

List<Integer> result = numbers.stream()
  .filter(n -> n%2 == 0)
  .map(n -> n*n)
  .collect(Collectors.toList());

System.out.println(result); // [4, 16]

차이

  • filter()로 조건에 맞는 것만 고르고
  • map()으로 변형해서
  • collect()로 최종 결과를 모음
  • for문 없이 '무엇을 할 지' 명확히 표현함

2. 함수를 변수처럼 쓰기

Function<Integer, Integer> square = x -> x * x;

int result = square.apply(5); // 25
  • Function<T, R>: 입력 T → 출력 R
  • Predicate<T>: 조건 (true/false)
  • Consumer<T>: 소비 (출력 등)
  • Supplier<T>: 공급 (값 제공)

3. 조건을 만족하는 숫자만 출력하기 (Predicate)

List<Integer> list = List.of(10, 15, 20, 25, 30);

Predicate<Integer> isDivisible5 = x -> x%5 == 0;

List.stream()
	.filter(isDivisible5)
    .forEach(System.out::println); // 10 15 20 25 30

요약

Java8부터 함수형 프로그래밍 가능
코드를 더 짧고 직관적으로, 버그를 줄이는 방식으로 작성할 수 있음.
stream, lambda, Function, Predicate 등을 사용함

기존 방식함수형 스타일
for로 조건 검사filter() 사용
직접 리스트 addmap()으로 처리 후 collect
하나하나 변수 선언함수나 람다로 간결하게 표현
profile
고민고민고민

0개의 댓글