람다 표현식은 Java 8에서 도입된 기능으로, 익명 함수를 더욱 간단하게 사용하기 위한 간단한 문법입니다. 람다 표현식을 사용하면 불필요한 코드를 줄이고, 함형 프로그래밍 스타일을 Java에서도 쉽게 활용할 수 있게 됩니다.
람다 표현식은
( parameters ) -> { body }
이런 식으로 사용됩니다.
- parameters : 입력 매개변수 (0개 이상)
- -> : 람다 연산자
- body : 실행할 코드
로 분류할 수 있습니다.
람다 표현식은 왜 필요할까?
람다 표현식의 가장 큰 장점은 간결함과 가독성이라고 할 수 있는데요. 기존의 Java 코드에서 사용되던 익명 클래스 코드가 길고 복잡하며 불필요한 구문으로 인해 핵심 로직을 파악하기 어려운 문제가 있었는데요 때문에 Java 8 부터는 람다 표현식이 나왔습니다!
Collections.sort(ls, new Comparator<String>() {
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
}
});
위 코도는 제가 1181. 단어 정렬를 풀기 위해 쓴 코드입니다. 이 코드는 제가 Java를 본격적으로 공부하고 얼마 안됐을때 사용했던 코드인데요 때문에 저는 익명 클래스를 사용해 문제를 풀었습니다. 위 코드는 Comparator 인터페이스를 구현하는 익명 내부 클래스를 생성하고 new Comparator<String>()으로 선언을 하고 compare 메서드의 전체를 구현해야 합니다. 으! 으! 말만 해도 복잡하죠?
이 코드를
Collections.sort(ls, (s1, s2) -> {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
});
이런 식으로 만들었습니다. 익명 클래스인 Comparator을 대신해 -> 연산자를 사용해 간단히 표현했습니다.
위에서 말했던거 처럼 매우 간결하고 가독성 높은걸 볼 수 있습니다.
Collections.sort(ls, (s1, s2) -> s1.length() == s2.length() ? s1.compareTo(s2) : s1.length() - s2.length());
그리고 더 단축해 위 같이 매우 간결하게도 만들 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
ArrayList<String> ls = new ArrayList<>();
for (int i = 0; i < n; i++) {
String s = br.readLine();
ls.add(s);
}
// 중복 제거
ls = ls.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
// 정렬
Collections.sort(ls, new Comparator<String>() {
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
}
});
for (String str :
ls) {
System.out.println(str);
}
}
}
이러한 전체 코드를
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
List<String> ls = new ArrayList<>();
for (int i = 0; i < n; i++) {
ls.add(br.readLine());
}
// 중복 제거 및 정렬
ls = ls.stream()
.distinct()
.sorted((s1, s2) ->
s1.length() == s2.length() ? s1.compareTo(s2) : s1.length() - s2.length())
.collect(Collectors.toList());
// 출력
ls.forEach(System.out::println);
}
}
이런 식으로 매우 간결하게 중복 제거와 동시에 정렬을 할 수 있습니다.
람다 표현식 vs 익명 클래스
익명 클래를 사용하면 클래스 파일 내부에 별도의 클래스 인스턴스가 생성되서 메모리를 차기하지만 람다는 클래스 인스턴스를 따로 생성하지 않아 메모리 사용량이 더 적고 익명 클래스 객체를 생성하는데 시간이 걸리지만 람다는 JVM이 바로바로 메서드 참조를 생성하기 때문에 익명 클래스보다 빠릅니다.
'백엔드' 카테고리의 다른 글
CORS란? (0) | 2025.02.07 |
---|---|
서버리스 (0) | 2024.12.10 |
JPA vs Mybatis (0) | 2024.11.25 |
런타임 데이터 영역 (0) | 2024.08.14 |
JAVA와 JVM (0) | 2024.08.12 |