티스토리 뷰

Java

[Java 8] - 함수형 인터페이스와 메소드 참조

영지는 달리는중 2020. 11. 14. 00:22

1. 람다 함수(Lambda Function)이란?

함수형 프로그래밍 언어에서 사용되는 개념으로 익명함수라고도 한다

Java 8 부터 지원되며, 불필요한 코드를 줄이고 가독성을 향상시키는 것을 목적으로 두고 있다 

 

람다 함수를 특정 메소드의 매개변수로 넘기기 위해서는 메소드의 매개변수가 함수형 인터페이스여야 한다

자바에서 함수형 인터페이스는 @FuntionalInterface를 붙여 선언한다. 이 인터페이스는 반드시 추상 메소드 한개만 정의되어있다

 

- 함수형 인터페이스와 람다 예시 

        //익명 함수 사용법
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread!");
            }
        }).start();
        
        
        //람다식 사용법
        new Thread(() -> {
            System.out.println("Thread!");
        }).start();

기존에는 Runnable()을 익명함수로 만들어 사용하였지만 Java8 부터는 람다식을 사용할 수 있게 되었다

Thread 메소드의 매개변수로 람다식이 사용되었는데 람다 함수를 매개변수로 넘기기 위해서는 메소드의 매개변수가 @FunctionalInterface로 선언된 인터페이스여야한다. 한번 살펴보자 

 

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

확인을 해보면 함수형 인터페이스 인것을 볼 수 있다 

 

- 자바에서 제공하는 함수형 인터페이스 예시 

//Supplier<T>
Supplier<String> supplier = () -> "Hello World!";
	System.out.println(supplier.get());


//Consumer<T>
Consumer<String> consumer = (str) -> {
            System.out.println(str);
        };
        
        consumer.accept("Hello World!");
        
//Function<T,R>
 Function<String, Integer> function = (str) -> {
            return str.length();
        };

        System.out.println(function.apply("Hello World!"));
        
        
//Predicate<T>
Predicate<String> predicate = (String str) -> {
            return "Hello World!".equals(str);
        };

        System.out.println(predicate.test("Hello !!"));
  • Supplier<T> : 매개변수는 없고 반환값이 있는 함수형 인터페이스이다
  • Consumer<T> : 객체 T를 매개변수로 받아서 특정 동작을 수행하는 목적을 가진 인터페이스다 반환값은 없다
  • Function<T,R> : 객체 T를 매개변수로 받아 특정 동작 수행 후 R객체를 반환한다
  • Predicate<T> : 객체 T를 매개변수로 받아 특정 동작을 수행 후 Boolean 형태로 반환한다

2. 메소드 참조(Method Reference)

함수형 인터페이스에 람다식이 아닌 일반적으로 사용하는 메소드를 참조시키는 방법이다

참조 조건으로는 함수형 인터페이스의 메소드의 시그니처가 참조하려는 메소드의 시그니처와 일치해야한다

람다식이 단순히 메소드를 실행시키는 용도로 사용될 때 사용하면 유용하다

 

참조가 가능한 메소드로는 일반 메소드, static 메소드, 생성자 가 있다

 

- 생성자 참조 예시 

//매개변수가 없는 생성자를 갖는 Apple은 Supplier 인터페이스 메소드의 시그니처와 같다
Supplier<Apple> c1 = Apple::new;
Supplier<Apple> c1 = () -> new Apple();

//Apple(Integer weight)라는 시그니처를 갖는 생성자는 Function 인터페이스 메소드의 시그니처와 같다
Function<Integer, Apple> c2 = Apple::new;
Function<Integer, Apple> c2 = (weight) -> new Apple(weight);
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함