람다식이란?
람다식이란?
람다식은 익명함수를 생성하기 위한 식으로 객체지향 언어보다는 함수지향 언어에 가깝다. 자바에서 람다식을 사용하는 이유는 자바코드가 매우 간결해지고, 컬렉션의 요소를 필터링하거나 매핑서 원혀는 결과를 쉽게 집계할 수 있다. 람다식의 형태는 매개변수를 가진 코드 블록이지만, 런타임시에는 익명 구현 객체를 생성한다.
람다식 -> 매개 변수를 가진 코드블록 -> 익명 구현 객체
예를 들어 Runnable 인터페이스의 익명 구현 객체를 생성하는 전형적인 코드는 다음과 같다.
Runnable runnable = new Runnable() {
public void run() {...}
}
위코드를 익명 구현 객체를 람다식으로 표현하면 다음과 같다.
Runnable runnable = () -> {..}
1. 타겟 타입과 함수적 인터페이스
람다식의 형태는 매개변수를 가진 코드 블록이기때문에 마치 자바의 메소드를 선언하는거서럼 보인다. 하지만 람다식은 단순히 메소드를 선언하는것이 아니라 이 메소드를 가지고 있는 객체를 생성해낸다.
인터페이스 변수 = 람다식
람다식은 인터페이스를 변수에 대입한다. 이말은 람다식은 이명 구현객체를 생성한다는 의미이다. 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라한다.
함수적 인터페이스(@FuntionalInteface)
모든 인터페이스를 람다식의 타겟 타입으로는 사용할 수 없다. 람다식이 하나의 메소드를 정의하기때문에 두 개 이상의 추상 메소드가 선언된 인ㅌ터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다. 하나의 추상 메소드가 선언된 인터페잇므ㅏㄴ이 람다식의 타겟 타입이 될 수 있는데, 이러한 인터페이스를 함수적 인터페이스(Functional interface)라한다.
함수적 인터페이스를 작성할때 두개 이상의 추상 메소드가 선언되지 않도록 컴파일러가 체킹해주는 기능이 있는데, 인터페이스 선언시 @FuntionalInterface 어노테이션을 붙이면된다.
@FuntionalInterface
public interface MyFuntionalInterface {
public void method();
public void otherMethod(); // 컴파일 오류
}
2. 표준 API의 함수적 인터페이스
자바에서 제공 되는 표준 API에서 한개의 추상 메소드를 가지는 인터페이스들은 모두 람다ㅣ식을 이용해서 익명 구현 객체로 표현이 가능하다. 예를들어 스레드의 작업을 정의하는 Runnable 인터페이스는 매개변수와 리턴값이 없는 run() 메소드만 존재하기 때문에 다음과 같이 람다식을 이용해서 Runnable 인터페이스를 생성시킬 수 있다
public class RunnableExample{
public static void main(String[] args) {
Runnable runnable = () -> {
for( int i = 0; i< 10; i++) {
System.out.println(i);
}
}
Thread thread = new Thread(runnable);
thread.start();
}
}
자바 9부터는 빈번하게 사용되는 함수적 인터페이스(functional interface)는 java.util.function 표준 API 패키지로 제공한다. java.util.function패키지의 함수적인터페이스는 크게 Consumer, Supplier, Funtion, Operator, Predicate로 구분된다. 이 함수 인터페이스의 차이점은 매개값과 리턴값의 유미이다.