람다식이란?
람다식(Lambda Expression)은 자바 8에서 도입된 기능으로, 간결한 방식으로 함수형 프로그래밍을 지원하는 문법 .
함수형 인터페이스(추상 메서드가 하나만 있는 인터페이스)를 구현하는 코드를 더 간단하게 작성할 수 있게 해준다.
즉, 메서드를 하나의 인수로 전달하거나, 익명 함수처럼 사용할 수 있다.
1) 기본 형태
(parameters) -> { body }
-> 위와 같이 기본 형태로 쓴다.
파라미터 : 입력 값 (생략 가능)
화살표 : 람다식에서 매개변수와 바디를 구분하는 역할
바디 : 함수의 구현부
2) 기존 방식 : 익명 클래스 (한번 사용하고 말 클래스 정의)
람다식이 없을 때는 아래와 같은 익명 클래스를 사용 해야했다.
// Runnable 인터페이스를 익명 클래스로 구현
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello, Lambda!");
}
};
new Thread(runnable).start();
위 코드는 쓰레드에서 사용하는 인터페이스를 익명 클래스로 구현한 예시
3) 람다식 사용
람다식을 사용하면 2)의 코드를 다음처럼 표현 가능
Runnable runnable = () -> System.out.println("Hello, Lambda!");
new Thread(runnable).start();
=> ()를 통해 파라미터가 없는 경우를 나타내고 한 줄의 코드만 있으면 {} 와 return은 생략이 가능하다.
1) 리스트 정렬
List<String> names = Arrays.asList("Tom", "Jerry", "Alice", "Bob");
// 기존 방식
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// 람다식 사용
Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
Collections 의 sort 메서드를 사용하는 예시로서
Comparator 를 통해 사용자 정의로 정렬 순서를 지정하는 예시이다.
이때 람다식을 사용하면 위처럼 훨씬 간단하게 Comparator 를 지정가능
2) 스트림 api 와 함께 사용하기
=> 보통은 Stream api 에서 람다식을 자주 사용한다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0) // 짝수 필터링
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4, 6, 8, 10]
위 경우 리스트에서 짝수를 추출하는 예시이다.
리스트의 스트림을 생성하고 짝수 조건을 통해 필터링을 한다.
이때 필터링 조건으로 위와 같이n-> n%2 ==0의 조건이 참인 것만 필터링
그리고 해당 값들을 컬렉션 중에 리스트 형태로 변환하도록 하였다.
장점:
1. 코드의 간결성 : 람다식을 사용하면 코드가 간결해짐 (가독성 up)
2. 익명 클래스 대체 : 함수형 인터페이스 구현 시 익명 클래스 대체 가능
3. 병렬 처리 : 스트림 api와 함께 사용하여 병렬 처리 쉽게 구현 가능
주의점:
1. 디버깅 어려움 : 코드가 간결해지는 만큼 디버깅이 조금 어려움
2. 익숙하지 않을 수 있음
람다식은 함수형 인터페이스와 함께 사용된다. 대표적인 함수형 인터페이스는 java.util.function 패키지에 정의된 인터페이스들 이다.
Predicate<T>: 입력을 받아 true/false 반환 (예: filter 메서드)
Consumer<T>: 입력을 받아 처리만 하고 반환값 없음 (예: forEach 메서드)
Function<T, R>: 입력을 받아 변환 후 반환 (예: map 메서드)