람다식은 자바 8에서 등장한 주요 기능 중 하나이다. 자바 8 이전에는 자바에서 함수를 객체로 전달하기 위해서는 익명 클래스를 사용해야 했다. 그러나 익명 클래스의 문법은 번거롭고 가독성이 좋지 않았다.
문법의 복잡성: 익명 클래스를 사용하면 반복적으로 new 인터페이스이름() { ... }와 같이 새로운 클래스를 정의해야 했다. 이는 코드를 더 복잡하게 만들고 가독성을 떨어뜨렸다.
코드 길이 증가: 익명 클래스를 사용하면 클래스를 새로 정의해야 했기 때문에 간단한 작업에도 많은 코드가 필요했다.
따라서 함수형 프로그래밍 언어에서 자주 사용되는 간결한 문법을 제공하는 람다식이 도입되었다.
람다식은 익명 클래스의 단축 버전이라 볼 수 있다!!!
Runnable 인터페이스를 구현하는 익명 클래스와 람다식을 비교해보자.
// 익명 클래스
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello from anonymous class!");
}
};
// 람다식
Runnable runnable2 = () -> System.out.println("Hello from lambda expression!");
익명클래스 대비 람다식이 훨씬 간결하고 가독성이 좋다!!
람다식의 문법은 일반적으로 (매개변수) -> {실행 코드} 형태로 표현함
람다식의 예시를 좀 더 알아보자.
단일 매개변수를 받을 경우
// 익명 클래스
MyInterface myInterface1 = new MyInterface() {
@Override
public void method(int x) {
System.out.println("Value: " + x);
}
};
// 람다식
MyInterface myInterface2 = (x) -> System.out.println("Value: " + x);
다중 매개변수를 받을 경우
// 익명 클래스
Calculator calculator1 = new Calculator() {
@Override
public int calculate(int x, int y) {
return x + y;
}
};
// 람다식
Calculator calculator2 = (x, y) -> x + y;
복잡한 실행코드를 가지는 경우
// 익명 클래스
MyFunction myFunction1 = new MyFunction() {
@Override
public int operate(int x, int y) {
int result = x * y;
return result;
}
};
// 람다식
MyFunction myFunction2 = (x, y) -> {
int result = x * y;
return result;
};
참고로 람다식은 필요에 따라 중괄호 {} 로 감싸서 여러 줄의 코드를 작성할 수 있다!!!