Kim-Baek 개발자 이야기

함수형 인터페이스(Functional Interface) 완벽 가이드 본문

개발/java basic

함수형 인터페이스(Functional Interface) 완벽 가이드

김백개발자 2025. 2. 16. 16:45

✅ 함수형 인터페이스란?

함수형 인터페이스(Functional Interface)란 "단 하나의 추상 메서드만 가지는 인터페이스" 를 의미합니다.
자바에서 람다 표현식(->)과 함께 사용하기 위해 만들어진 인터페이스
메서드가 1개만 있으므로, 람다식으로 쉽게 구현 가능
@FunctionalInterface 어노테이션을 사용하면 컴파일러가 함수형 인터페이스인지 확인해줌


📌 대표적인 함수형 인터페이스 8가지

🚀 1️⃣ Function<T, R> (입력값을 변환하여 반환)

입력값 T를 받아서 R로 변환하는 함수
어떤 값을 입력받아서 변환하는 기능이 필요할 때 사용
예제: Integer → String 변환

Function<Integer, String> intToString = num -> "숫자: " + num;
System.out.println(intToString.apply(10)); // 결과: "숫자: 10"

🚀 2️⃣ UnaryOperator<T> (입력과 반환 타입이 같은 Function)

입력값과 반환값의 타입이 같은 Function<T, T>의 특수한 형태
입력값을 변형하지만 타입은 유지될 때 사용
예제: 문자열을 대문자로 변환

UnaryOperator<String> toUpperCase = str -> str.toUpperCase();
System.out.println(toUpperCase.apply("hello")); // 결과: "HELLO"

🚀 3️⃣ BinaryOperator<T> (두 개의 입력값을 받아 같은 타입으로 반환)

BiFunction<T, T, T>와 동일하지만, 입력값과 반환값이 모두 같은 타입
두 개의 입력값을 조합하여 결과를 만드는 경우 사용
예제: 두 숫자의 합 계산

BinaryOperator<Integer> sum = (a, b) -> a + b;
System.out.println(sum.apply(3, 7)); // 결과: 10

🚀 4️⃣ BiFunction<T, U, R> (두 개의 입력값을 받아 변환)

서로 다른 타입의 두 개의 입력값을 받아서 새로운 결과(R)를 반환
예제: 문자열을 Integer 횟수만큼 반복

BiFunction<String, Integer, String> repeatString = (str, times) -> str.repeat(times);
System.out.println(repeatString.apply("Hello ", 3)); // 결과: "Hello Hello Hello "

🚀 5️⃣ Predicate<T> (입력값을 검사하여 true 또는 false 반환)

조건을 검사하여 true 또는 false를 반환하는 함수
if 문을 줄이고 스트림에서 필터링할 때 유용
예제: 숫자가 짝수인지 확인

Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // 결과: true
System.out.println(isEven.test(5)); // 결과: false

🚀 6️⃣ BiPredicate<T, U> (두 개의 입력값을 받아 true 또는 false 반환)

두 개의 입력값을 비교하여 true 또는 false를 반환하는 함수
예제: 두 개의 문자열이 같은지 비교

BiPredicate<String, String> isEqual = (s1, s2) -> s1.equals(s2);
System.out.println(isEqual.test("hello", "hello")); // 결과: true
System.out.println(isEqual.test("hello", "world")); // 결과: false

🚀 7️⃣ Supplier<T> (입력값 없이 값을 반환)

아무 입력값 없이 T 타입의 값을 반환하는 함수
예제: 랜덤 숫자 생성

Supplier<Double> randomNumber = () -> Math.random();
System.out.println(randomNumber.get()); // 결과: 랜덤 값 출력

🚀 8️⃣ Consumer<T> (입력값을 받아서 처리만 하고 반환값 없음)

입력값을 받아서 출력하거나 저장하는 등의 작업을 수행하지만, 결과를 반환하지 않음
예제: 메시지 출력

Consumer<String> printMessage = message -> System.out.println("출력: " + message);
printMessage.accept("Hello!"); // 결과: "출력: Hello!"

🚀 9️⃣ BiConsumer<T, U> (두 개의 입력값을 받아 처리, 반환값 없음)

입력값 두 개를 받아 작업을 수행하지만 반환값이 없음
예제: 두 개의 값을 받아 출력

BiConsumer<String, Integer> printUserInfo = (name, age) ->
    System.out.println(name + "의 나이는 " + age + "살입니다.");

printUserInfo.accept("Alice", 25); 
// 결과: "Alice의 나이는 25살입니다."

📌 함수형 인터페이스 쉽게 정리

함수형 인터페이스 역할 메서드 예제

Function<T, R> 값을 변환하여 반환 R apply(T t) Integer -> String 변환
UnaryOperator<T> 입력값을 변환 (타입 동일) T apply(T t) 문자열 대문자로 변환
BinaryOperator<T> 두 개의 입력값을 받아 변환 (타입 동일) T apply(T t1, T t2) 숫자 덧셈
BiFunction<T, U, R> 두 개의 입력값을 받아 변환 R apply(T t, U u) 문자열 반복
Predicate<T> 조건 검사 후 true / false 반환 boolean test(T t) 짝수 여부 검사
BiPredicate<T, U> 두 개의 값 비교 후 true / false 반환 boolean test(T t, U u) 문자열 비교
Supplier<T> 입력 없이 값 반환 T get() 랜덤 숫자 생성
Consumer<T> 값을 받아서 처리 (출력, 저장) void accept(T t) 메시지 출력
BiConsumer<T, U> 두 개의 값을 받아서 처리 void accept(T t, U u) 사용자 정보 출력

📌 결론

✅ 함수형 인터페이스는 "하나의 메서드만 가진 인터페이스"로, 람다 표현식과 함께 사용하기 편리함!
✅ Function, Predicate, Supplier, Consumer가 가장 많이 쓰이는 대표적인 함수형 인터페이스
✅ 복잡한 for 문이나 if 문을 줄이고, stream()과 함께 사용하면 가독성이 좋아짐! 🚀

'개발 > java basic' 카테고리의 다른 글

CompletableFuture 란 무엇일까  (0) 2024.11.26
자바 리플렉션이란  (0) 2024.11.24
리액티브 프로그래밍이란  (0) 2024.11.17
제네릭 타입 소거 (컴파일/런타임)  (0) 2024.11.16
일급 컬렉션이란?  (0) 2024.11.13
Comments