본문 바로가기
Language/Java

[Java API] 함수형 프로그래밍 익숙해지기(java.util.function 패키지)

by 클레어몬트 2025. 3. 17.

https://claremont.tistory.com/entry/Java-Stream-API%EC%99%80-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

[Java] Stream API와 함수형 프로그래밍

Java 8부터 도입된 Stream API는 프로그래밍 스타일을 완전히 바꿔놓았다고 해도 과언이 아니다. 처음에는 그냥 반복문을 대체하는 기능 정도로만 생각했는데, 쓰면 쓸수록 '이거 꽤 강력한데?'라는

claremont.tistory.com

먼저 함수형 프로그래밍이 뭔지! 개념에 대해 알고 오자 :>

 

 

 

Java에서는 람다 표현식(Lambda Expressions)을 활용하여 간결한 코드 작성을 지원하기 위해 표준 함수형 인터페이스(Functional Interface)를 제공한다!
이러한 인터페이스는 java.util.function 패키지에 포함되어 있으며, 대표적인 함수형 인터페이스에는 Predicate, Consumer, Supplier, Function, Comparator, Runnable, Callable 등이 있다.

[표준 함수형 인터페이스 종류]

1️⃣ Predicate<T> (T -> boolean)

  • 입력값 T를 받아 boolean을 반환하는 함수형 인터페이스
  • 주로 조건 검사(필터링)할 때 사용
import java.util.function.Predicate;

public class PredicateExample {
    public static void main(String[] args) {
        Predicate<Integer> isEven = num -> num % 2 == 0;
        System.out.println(isEven.test(10)); // 출력: true
        System.out.println(isEven.test(7));  // 출력: false
    }
}

 

test(T t) 메서드를 사용하여 입력값이 조건을 만족하는지 검사한다


2️⃣ Consumer<T> (T -> void)

  • 입력값 T를 받아 반환값 없이 작업을 수행하는 함수형 인터페이스
  • 주로 요소를 출력하거나, 로깅 등의 작업에 사용
import java.util.function.Consumer;

public class ConsumerExample {
    public static void main(String[] args) {
        Consumer<String> printMessage = message -> System.out.println("출력: " + message);
        printMessage.accept("Hello, Java!"); // 출력: 출력: Hello, Java!
    }
}

 

accept(T t) 메서드를 사용하여 입력값을 받아 소비(출력, 저장 등)하는 역할을 수행한다


3️⃣ Supplier<T> (() -> T)

  • 매개변수 없이 값을 생성하고 반환하는 함수형 인터페이스
  • 주로 랜덤 값 생성, 날짜 반환, 기본값 설정 등에 사용
import java.util.function.Supplier;
import java.time.LocalTime;

public class SupplierExample {
    public static void main(String[] args) {
        Supplier<String> currentTime = () -> LocalTime.now().toString();
        System.out.println("현재 시간: " + currentTime.get()); // 현재 시간 출력
    }
}

 

get() 메서드를 사용하여 매개변수 없이 값을 제공하는 역할을 수행한다


4️⃣ Function<T, R> (T -> R)

  • 입력값 T를 받아 출력값 R을 반환하는 함수형 인터페이스
  • 주로 변환 작업(데이터 가공, 변환, 매핑)에 사용
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(5)); // 출력: 숫자: 5
    }
}

 

apply(T t) 메서드를 사용하여 입력값을 특정 값으로 변환하는 역할을 수행한다


5️⃣ Comparator<T> ((T, T) -> int)

  • 두 개의 값을 비교하여 정렬 기준을 제공하는 함수형 인터페이스
  • 주로 정렬 시 사용 (compare(T o1, T o2))
import java.util.Comparator;

public class ComparatorExample {
    public static void main(String[] args) {
        Comparator<Integer> compareNumbers = (a, b) -> Integer.compare(a, b);
        System.out.println(compareNumbers.compare(5, 10)); // 출력: -1 (5 < 10)
        System.out.println(compareNumbers.compare(10, 5)); // 출력: 1 (10 > 5)
        System.out.println(compareNumbers.compare(5, 5));  // 출력: 0 (같음)
    }
}
 

 

compare(T o1, T o2) 메서드를 사용하여 두 개의 값을 비교하고 정렬 기준을 제공한다


6️⃣ Runnable (() -> void)

  • 매개변수가 없고 반환값도 없는 함수형 인터페이스
  • 주로 스레드 실행(Thread)을 위한 작업을 정의할 때 사용
public class RunnableExample {
    public static void main(String[] args) {
        Runnable task = () -> System.out.println("Runnable 실행 중...");
        Thread thread = new Thread(task);
        thread.start();
    }
}

 

run() 메서드를 사용하여 별도의 반환값 없이 작업을 수행한다


7️⃣ Callable<V> (() -> V)

  • 매개변수 없이 값을 반환하는 함수형 인터페이스
  • Runnable과 비슷하지만, 반환값을 가짐 (call() 메서드 사용)
  • 주로 스레드 작업에서 결과 값을 반환해야 할 때 사용
import java.util.concurrent.Callable;

public class CallableExample {
    public static void main(String[] args) throws Exception {
        Callable<String> task = () -> "Callable 실행 완료!";
        System.out.println(task.call()); // 출력: Callable 실행 완료!
    }
}

 

 

call() 메서드를 사용하여 스레드 작업이 끝난 후 결과 값을 반환할 수 있다


✅ 표준 함수형 인터페이스 정리

 
 
 

 

[정리]

  • java.util.function 패키지는 다양한 함수형 인터페이스를 제공하여 람다 표현식과 함께 사용 가능하다!
  • Predicate, Consumer, Supplier, Function, Comparator, Runnable, Callable 등은 자바에서 함수형 프로그래밍을 지원하는 핵심 요소이다
  • Predicate → 조건 검사, Consumer → 값 소비(출력, 저장), Supplier → 값 제공, Function → 변환, Comparator → 비교 및 정렬, Runnable/Callable → 스레드 실행 등 각 역할이 명확하다
  • 실무에서는 함수형 인터페이스를 적극 활용하여 간결한 코드 작성이 가능하다!

 

 

함수형 프로그래밍에 점점 익숙해져가는 요즘.. 뭔가 "색다른" 느낌이 든다 😳

#SK, #SKALA, #SKALA1기