람다식은 Java 8부터 도입된 함수형 프로그래밍의 개념 중 하나로,
람다 표현식(lambda expression)이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다.
int min(int x, int y) {
return x < y ? x : y;
}
(x, y) -> x < y ? x : y;
위의 예제처럼 메소드를 람다 표현식으로 표현하면, 클래스를 작성하고 객체를 생성하지 않아도 메소드를 사용할 수 있다. 그런데 자바에서는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스라고 한다. 따라서 자바에서 람다 표현식은 익명 클래스와 같다고 할 수 있다.
(x, y) -> x < y ? x : y;
new Object() {
int min(int x, int y) {
return x < y ? x : y;
}
}
이러한 람다 표현식은 메소드의 매개변수로 전달될 수도 있으며, 메소드의 결괏값으로 반환될 수도 있다.
따라서 람다 표현식을 사용하면, 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여준다.
Java SE 8부터는 이러한 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었다.
다음은 Runnable 인터페이스를 구현한 람다식의 예제이다. 참고로 Runnable 인터페이스는 run() 메서드 1개만 갖고 있으므로 람다식 적용이 가능하다.
람다식을 적용하지 않는다면 아래와 같다.
new Thread(new Runnable() {
public void run(){
System.out.println("Lambda");
}
}).start();
람다식을 적용하면 아래와 같다.
new Thread(() -> {
System.out.println("Lambda");
}).start();
;은 붙이지 않음);은 붙이지 않음)람다 표현식을 사용할 때는 람다 표현식을 저장하기 위한 참조 변수의 타입을 결정해야만 한다.
참조변수의타입 참조변수의이름 = 람다 표현식
위의 문법처럼 람다 표현식을 하나의 변수에 대입할 때 사용하는 참조 변수의 타입을 함수형 인터페이스라고 부른다.
함수형 인터페이스는 추상 클래스와는 달리 단 하나의 추상 메소드만을 가져야 한다.
또한, 다음과 같은 어노테이션(annotation)을 사용하여 함수형 인터페이스임을 명시할 수 있다.
@FunctionalInterface
위와 같은 어노테이션을 인터페이스의 선언 앞에 붙이면, 컴파일러는 해당 인터페이스를 함수형 인터페이스로 인식한다.
자바 컴파일러는 이렇게 명시된 함수형 인터페이스에 두 개 이상의 메소드가 선언되면 컴파일 오류를 발생시킨다.
@FunctionalInterface
interface Calc { // 함수형 인터페이스의 선언
public int min(int x, int y);
}
public class Lambda02 {
public static void main(String[] args) {
Calc minNum = (x, y) -> x < y ? x : y; // 추상 메소드의 구현
System.out.println(minNum.min(3, 4)); // 함수형 인터페이스의 사용
}
}
참고 자료
http://www.tcpschool.com/java/java_lambda_concept
https://makecodework.tistory.com/entry/Java-%EB%9E%8C%EB%8B%A4%EC%8B%9DLambda-%EC%9D%B5%ED%9E%88%EA%B8%B0