본문 바로가기

java/자바

함수형 인터페이스(Functional Interface)

단 하나의 추상 메소드를 가지는 인터페이스를 의미합니다.

이러한 특성 덕분에 람다 표현식(lambda expression)이나

메소드 참조(method reference)와 같은 기능을 이용해 간결하게 표현할 수 있습니다.

 

자바 8 이상에서 함수형 프로그래밍을 지원하기 위해 도입되었습니다.

 

함수형 인터페이스는 @FunctionalInterface(annotation)으로 명시적으로 표시될 수 있습니다.

annotation은 필수는 아니지만, 함수형 인터페이스의 의도를 명확히 하고,

실수로 추가적인 추상 메소드를 선언하는 것을 방지하는 데 도움이 됩니다.

 

대표적인 함수형 인터페이스

Consumer: 매개변수로 받은 값을 처리하는데 사용합니다.

Consumer<T>: 타입 T를 입력으로 받아서 반환값 없이 소비하는 연산을 나타냅니다.

 

Supplier: 값을 제공하는데 사용합니다.

Supplier<T>: 어떤 입력도 받지 않고 타입 T의 결과를 반환하는 함수를 나타냅니다.

 

Function: 매개변수로 받은 값을 다른 값으로 변환하는데 사용합니다.

Function<T, R>: 타입 T를 입력으로 받아 타입 R을 결과로 반환하는 함수를 나타냅니다.

 

Predicate: 조건을 검사하는데 사용합니다.

Predicate<T>: 타입 T를 입력으로 받아 boolean 값을 반환하는 함수를 나타냅니다.

 

Operator: 두 값을 조작하는데 사용합니다.

UnaryOperator<T>: 타입 T의 객체를 입력으로 받아 동일한 타입의 객체를 반환하는 함수입니다

BinaryOperator<T>: 동일한 타입 T의 두 객체를 입력으로 받아 동일한 타입의 객체를 반환하는 함수입니다.

 

// Consumer 예시
Consumer<String> printer = System.out::println;
printer.accept("Hello, world!");

// Function 예시
Function<Integer, String> doubler = x -> x * 2;
String result = doubler.apply(10); // "20"

// Predicate 예시
Predicate<String> isEven = str -> str.length() % 2 == 0;
boolean isEvenStr = isEven.test("Hello"); // false

// Supplier 예시
Supplier<Integer> randomSupplier = () -> (int) (Math.random() * 100);
for (int i = 0; i < 5; i++) {
  System.out.println(randomSupplier.get());
}

// Supplier 예시 2
Supplier<LocalDateTime> nowSupplier = () -> LocalDateTime.now();
System.out.println(nowSupplier.get());

// Operator 예시
BinaryOperator<Integer> sumOperator = (a, b) -> a + b;
System.out.println(sumOperator.apply(10, 20)); // 30

// Operator 예시 2
Comparator<String> stringLengthComparator = (a, b) -> a.length() - b.length();
System.out.println(stringLengthComparator.compare("Hello", "World")); // -1

// Operator 예시 3
UnaryOperator<String> toUpperCaseOperator = String::toUpperCase;
System.out.println(toUpperCaseOperator.apply("hello")); // HELLO