자바 & 스프링

Java 8 Lambda — 1

p829911 2021. 11. 30. 20:19

자바의 신 2를 정리했습니다.

익명 클래스는 가독성도 떨어지고 불편하다. 이러한 단점을 보완하기 위해서 람다 표현식이 만들어졌다.

대신, 이 표현식은 인터페이스에 메소드가 하나인 것들만 적용 가능하다. 그래서 람다 표현식은 익명 클래스로 전환이 가능하며, 익명 클래스는 람다 표현식으로 전환이 가능하다.

자바에서 메소드가 하나인 인터페이스

  • java.lang.Runnable
  • java.util.Comparator
  • java.io.FileFilter
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
interface Calculate {
	int operation(int a, int b);
}

일반적인 인터페이스지만, 이 인터페이스는 Functional(기능적) 인터페이스라고 부를 수 있다. 기능적 인터페이스는 이와 같이 하나의 메소드만 선언되어 있는 것을 의미한다. 그런데, 이렇게만 선언해두면 매우 혼동될 수도 있다. 메소드를 추가하면 컴파일 에러가 난다. 그래서 명시적으로 @FunctionalInterface 라는 어노테이션을 사용하면 이 인터페이스에는 하나의 메소드만 선언할 수 있다.

@FunctionalInterface
interface Calculate {
    int operation(int a, int b);
}

익명 클래스로 구현

private void calculateClassic() {
    Calculate calculateAdd = new Calculate() {
	@Override
	public int operation(int a, int b) {
     	    return a + b;
        }
    };
    System.out.println(calculateAdd.operation(1, 2));
}

람다 표현식으로 구현

private void calculateLambda() {
    Calculate calculateAdd = (a, b) -> a + b;
    System.out.println(calculateAdd.operation(1, 2));
}

Runnable interface 람다 표현식으로 구현

private void runThread() {
    new Thread(() -> {
        System.out.println(Thread.currentThread().getName());
    }).start();
}

run() 메소드에서 처리하는 것이 한 줄이므로 더 간단히 표현 가능

private void runThreadSimple() {
    new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
}
  • 메소드가 하나만 존재하는 인터페이스는 @FunctionalInterface 로 선언할 수 있으며, 이 인터페이스를 람다 표현식으로 처리할 수 있다.
  • (매개 변수 목록) → 처리식으로 람다를 표현하며, 처리식이 한 줄 이상일 때에는 처리식을 중괄호로 묶을 수 있다.

'자바 & 스프링' 카테고리의 다른 글

PreparedStatement 쿼리를 사용하는 이유  (0) 2021.11.30
JPA allocationSize default 값이 50인 이유  (0) 2021.11.30
java - thread 동기화  (0) 2021.11.30
java - Stream  (0) 2021.11.30
Java 8 Lambda — 2  (0) 2021.11.30