elevne's Study Note
Java Functional Interface 본문
이번에는 Java 의 Functional Interface 에 대해 알아보았다. Functional Interface 란 단 하나의 추상 메서드를 가지는 인터페이스를 말한다. (단 default 메서드는 제외한다) @FunctionalInterface 메서드가 사용될 수 있는데 이는 인터페이스가 Functional Interface 라는 것을 명시해주며, 이를 사용할 시 부적절한 메서드를 추가하거나 다른 인터페이스를 상속받으면Compile error 을 발생시킨다.
Functional Interface 를 사용하는 이유는 무엇일까? 함수형 개발 방식은 행위에 해당하는 부분도 값으로 취급이 가능해졌다는 뜻이다. 코드의 재활용 단위가 클래스에서 함수 단위로도 가능해진 것이며, 이는 개발을 더 유연하게 할 수 있게끔 한다. 아래와 같이 Functional Interface 를 사용해볼 수 있다.
package test_classes;
@FunctionalInterface
public interface Operator {
public abstract boolean operate();
}
import test_classes.Operator;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
int num1 = random.nextInt(10);
int num2 = random.nextInt(10);
boolean check = is(() -> num1 < num2);
System.out.println(check);
}
public static boolean is(Operator operator){
return operator.operate();
}
}
위 is 메서드는 Functional Interface 인 Operator 을 파라미터로 받으며, 이는 위에서 () -> num1 < num2 로 넣어진다. 이와 같이 람다식을 사용해볼 수 있는 것이다. Stream - filter 메서드를 사용할 때 filter 메서드에 인자로 들어가는 람다식도 Functional Interface 의 예로 볼 수 있다.
Java Package 에서는 아래와 같은 Functional Interface 들을 제공한다.
import test_classes.Operator;
import java.util.Random;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
// Runnable 매개변수 없고 리턴타입도 없음
Runnable runnable = () -> System.out.println("HELLO RUNNABLE");
runnable.run();
// Supplier<T> 매개변수 없으며, 리턴타입 T
Supplier<String> supplier = () -> "HELLO SUPPLIER";
System.out.println(supplier.get());
// Consumer<T> 매개변수 T, 리턴타입 없음
Consumer<String> consumer = (txt) -> System.out.println(txt);
consumer.accept("HELLO CONSUMER");
// Predicate<T> 매개변수 T, 리턴타입 boolean
Predicate<Integer> isEven = (num) -> num % 2 == 0;
System.out.println(isEven.test(6));
// Function<T, R> 매개변수 T, 리턴타입 R
Function<String, Integer> function = (txt) -> txt.length();
System.out.println(Integer.toString(function.apply("HELLO FUNCTION")));
}
}
이 외에도 Comparator, Callable 도 사용할 수 있으며 더 많은 메서드들의 조합을 통해 더욱 복잡한 코드도 Functional Interface 를 통해 구현해볼 수 있다.
Reference:
https://bcp0109.tistory.com/313
https://codechacha.com/ko/java8-functional-interface/
https://tecoble.techcourse.co.kr/post/2020-07-17-Functional-Interface/
'Backend > Java' 카테고리의 다른 글
Java Gson (0) | 2023.04.21 |
---|---|
Java Enum (0) | 2023.04.19 |
Thread, Future, ScheduledFuture, Runnable (0) | 2023.04.13 |
Java Keywords ... (0) | 2023.04.12 |
Cache 에 대하여 (0) | 2023.03.27 |