elevne's Study Note

Java Functional Interface 본문

Backend/Java

Java Functional Interface

elevne 2023. 4. 18. 19:24

이번에는 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();
    }
}

 

 

result

 

 

 

위 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")));
    }
}

 

 

result

 

 

 

이 외에도 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