GOAL

  • 함수형 인터페이스에 대해서 이해할 수 있습니다.
  • 함수형 인터페이스와 람다식을 사용할 수 있습니다.
  • 자바에서 제공해주는 함수형 인터페이스 종류들을 알 수 있습니다.

함수형 인터페이스

 

자바 8부터 함수를 일급객체 처럼 다룰 수 있는 함수형 인터페이스를 제공합니다.

 

함수형 인터페이스의 기본 조건은 SAM(Single Abstract Method)이어야 합니다.

public interface RunSomething {
    void doSomething(); // 인터페이스 메소드는 public abstract이며 생략 가능    
}

 

default 메소드나 static메소드가 있어도 추상 메소드가 한 개일 경우 함수형 인터페이스입니다.
@FunctionalInterface // 어노테이션을 붙이면 함수형 인터페이스임을 명시함
                    // 추상 메소드가 두 개 이상일 경우 컴파일 에러를 잡아줍니다.
public interface RunSomething {
    void doSomethig();

    static void printName(){
        System.out.println("brick");
    }

    default void turnOff(){
        System.out.println("turn off");
    }
}

 

함수형 인터페이스의 사용법 및 람다식

 

Question : 그럼 메소드 하나 사용하려고 매번 새로운 클래스를 만드는 건 비효율적인 방법 아닌가요??

 

-> 이런 의문점이 들 수 있습니다. 그래서 Java에서 기본적으로 제공하는 함수형 인터페이스들을 제공해 줍니다.

 

 

우선 그 중 하나인 Function인터페이스에 대한 예시를 보여드리겠습니다.

먼저 람다식을 사용하지 않고 익명 클래스(Anonymous Class)를 사용하는 방식으로 보여드리겠습니다.

 

public class Foo {
    public static void main(String[] args) {
        Function<String, Integer> toInt = new Function<String, Integer>() {
            @Override
            public Integer apply(String value) {
                return Integer.parseInt(value);
            }
        };
        
       final Integer number = toInt.apply("100");
    }
}

 

이번엔 람다식을 이용해보겠습니다.

public class Foo {
    public static void main(String[] args) {
        Function<String, Integer> toInt = value -> Integer.parseInt(value);
        
        final Integer number = toInt.apply("100");
    }
}

 

 

람다 

  • (인자 리스트) -> {바디}

인자 리스트

  • 인자가 없을 때 : ()
  • 인자가 한 개일 때 : (one) 또는 one
  • 인자가 여러개 일 때 : (one, two)
  • 인자타입은 생략 가능, 컴파일러가 추론

바디

  • 화살표 오른쪽에 함수 본문을 정의한다
  • 여러 줄인 경우 {}를 사용해서 묶는다.
  • 한 줄인 경우에 생략 가능, return도 생략 가능

변수 캡처 (Variable Capture)

  • 로컬 변수 캡처
    • final 이거나 effective final인 경우에만 참조할 수 있다.
    • 그렇지 않을 경우 concurrency 문제가 발생할 수 있어서 컴파일러가 방지한다.

● 자바에서 기본적으로 제공하는 함수형 인터페이스

 

다음은 자바에서 기본적으로 제공하는 함수형 인터페이스의 몇 가지만 간략하게 표로 정리한 것입니다.

 

추가적인 인터페이스들은 공식 문서에서 참고하시면 되겠습니다.

 

 

java.util.function (Java Platform SE 8 )

Interface Summary  Interface Description BiConsumer Represents an operation that accepts two input arguments and returns no result. BiFunction Represents a function that accepts two arguments and produces a result. BinaryOperator Represents an operation u

docs.oracle.com


 

References

 

백기선 - 더 자바8

케빈TV - 모던 자바(자바8) - 못다한 이야기