기술 학습

JAVA 함수형 프로그래밍(Functional Programming) 개념과 활용

EpicArts 2025. 2. 14. 18:07

1. 함수형 프로그래밍이란?

함수형 프로그래밍(Functional Programming)은 프로그래밍을 함수의 조합으로 표현하는 패러다임입니다. Java 8부터 함수형 프로그래밍을 적극적으로 지원하며, 람다 표현식과 스트림 API를 활용하여 코드의 간결성과 유지보수성을 높일 수 있습니다.

함수형 프로그래밍의 주요 특징:

  • 불변성(Immutability): 데이터의 변경 없이 순수 함수를 조합하여 사용
  • 순수 함수(Pure Function): 동일한 입력값에 대해 항상 동일한 결과 반환
  • 고차 함수(High-order Function): 함수를 인자로 전달하거나 반환할 수 있음
  • 지연 실행(Lazy Evaluation): 필요할 때만 연산 수행

2. 함수형 인터페이스와 람다 표현식

Java는 java.util.function 패키지를 제공하여 다양한 함수형 인터페이스를 지원합니다.

2.1 주요 함수형 인터페이스

인터페이스설명주요 메서드

Consumer<T> 입력을 받아 처리 (리턴값 없음) accept(T t)
Supplier<T> 입력 없이 값 반환 get()
Function<T, R> 입력을 받아 변환 후 반환 apply(T t)
Predicate<T> 입력을 받아 참/거짓 반환 test(T t)

2.2 함수형 인터페이스 예제

import java.util.function.Function;

public class FunctionExample {
    public static void main(String[] args) {
        Function<Integer, String> intToString = num -> "숫자: " + num;
        System.out.println(intToString.apply(10));
    }
}

3. 고차 함수와 메서드 참조

3.1 고차 함수 예제

import java.util.function.Function;

public class HighOrderFunctionExample {
    public static void main(String[] args) {
        Function<Integer, Integer> square = x -> x * x;
        Function<Integer, Integer> doubleValue = x -> x * 2;
        
        Function<Integer, Integer> combinedFunction = square.andThen(doubleValue);
        System.out.println(combinedFunction.apply(3)); // 18 (3*3=9, 9*2=18)
    }
}

3.2 메서드 참조 예제

import java.util.function.Consumer;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Consumer<String> print = System.out::println;
        print.accept("Hello, Method Reference!");
    }
}

4. 스트림 API와 함수형 프로그래밍

스트림 API는 함수형 프로그래밍의 핵심 요소 중 하나로, 컬렉션 데이터를 간결하게 처리할 수 있습니다.

4.1 filtermap 사용 예제

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamFunctionalExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
        List<String> filteredNames = names.stream()
                                          .filter(name -> name.startsWith("A"))
                                          .map(String::toUpperCase)
                                          .collect(Collectors.toList());
        System.out.println(filteredNames);
    }
}

5. 결론

이번 글에서는 Java의 함수형 프로그래밍 개념과 활용법을 살펴보았습니다. 함수형 프로그래밍을 사용하면 코드의 재사용성이 높아지고 유지보수성이 향상됩니다.

다음 글에서는 Java의 비동기 프로그래밍(Asynchronous Programming)과 CompletableFuture에 대해 알아보겠습니다!