Lambda Expression
람다 표현식은 함수를 간결하게 표현할 수 있다. 프로그래밍 언어의 개념으로는 단순한 익명 함수 생성 문법이라 이해할 수 있다. 기존의 불필요한 코드를 줄이고 가독성을 향상시키는 것이 목적이다.
-> 기호
( parameters ) -> expression body // 하나의 명령문만으로 이루어진 경우에 {} 생략 가능
( parameters ) -> { expression body }
가장 대표적인 예시로 Thread 실행이 있다. 람다식을 사용하지 않는 경우에는 아래와 같이 Runnable 인터페이스를 작성해서 매개변수로 입력해야 한다.
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Run!");
}
}).start();
하지만 람다식을 사용하면 아래와 같이 간략히 작성할 수 있다.
new Thread(()->{
System.out.println("Run!");
}).start();
@FunctionalInterface
람다식을 하나의 변수에 대입할 때 사용되는 참조 변수의 타입을 함수형 인터페이스라고 부른다.
예를들어, 아래와 같은 구문을 실행시키고자 할 때,
IMathAbs abs = (int n) -> Math.abs(n);
System.out.println(abs.calc_abs(-4)); // result: 4
IMathAbs
라는 인터페이스가 작성되어 있어야 한다.
interface IMathAbs {
public int calc_abs(int a);
}
이 인터페이스는 calc_abs
라는 하나의 추상 메소드를 가지고 있다. 람다식을 위한 인터페이스는 단 하나의 추상 메소드를 가지고 있어야 하기 때문에 여기에 다른 메소드를 추가할 경우 에러가 발생한다. 하지만 구현단계에서는 이 인터페이스가 람다식만을 위해 사용되는 것인지 구별하기 힘들고 오류도 발생하지 않는다. 그래서 해당 인터페이스가 람다식을 위해 사용된다는 것을 표시하기 위해 @FunctionalInterface
어노테이션을 사용한다.
@FunctionalInterface
interface IMathAbs {
public int calc_abs(int a);
}
그러므로 IMathAbs
인터페이스는 위와같이 작성한다.
:: 기호
ClassName::MethodName
or
VariableName::MethodName
메소드 참조(Method reference)를 위해 사용한다. 메소드 참조는 람다식이 단 하나의 메소드를 호출할 때 불필요한 매개변수를 제거하고 사용할 수 있게 한다.
IMathAbs abs = (int n) -> Math.abs(n); // -> 사용
System.out.println(abs.calc_abs(-4)); // result: 4
IMathAbs abs = Math::abs; // :: 사용
System.out.println(abs.calc_abs(-4)); // result: 4
'Language > Java' 카테고리의 다른 글
[java] Thread 작업 완료 확인 - Future (0) | 2019.09.01 |
---|---|
javaDoc에 샘플코드(xml 등) 작성하기 (0) | 2019.08.31 |
[java] RejectExecutionHandler reject policy - 작업 큐(workQueue)가 full인 상태에서의 처리 정책 (0) | 2019.08.30 |
[java8] Stream 연산자 정리 (0) | 2019.08.30 |
[java8] Stream vs Collection (0) | 2019.08.30 |
댓글