IT 공부 독서 정리/Java의 정석
람다식 설명 - 정리
방탄승
2024. 12. 1. 19:52
람다식 코드의 사용이 가능해졌다.
람다식이란 객체지향인 java언어에 함수형 프로그래밍을 지원하기 위해 추가된 개념이다.
아래는 기존 자바 코드와 람다식 코드를 비교해 본 결과이다.
정렬을 위해 Comparator 인터페이스를 사용한 코드
import java.util.Arrays;
import java.util.Comparator;
public class LambdaExample {
public static void main(String[] args) {
// 문자열 배열 생성
String[] names = {"A", "B", "C", "D"};
// Arrays.sort를 사용하여 문자열 배열을 길이로 정렬
Arrays.sort(names, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
// 정렬된 배열 출력
for (String name : names) {
System.out.println(name);
}
}
}
람다 표현식을 활용한 코드
import java.util.Arrays;
public class LambdaExample {
public static void main(String[] args) {
// 문자열 배열 생성
String[] names = {"A", "B", "C", "D"};
// 람다 표현식을 사용하여 문자열 배열을 길이로 정렬
Arrays.sort(names, (s1, s2) -> Integer.compare(s1.length(), s2.length()));
// 정렬된 배열 출력
for (String name : names) {
System.out.println(name);
}
}
}
람다식의 이해
- 장점:
- 코드 간결성 및 가독성 향상: 소스 코드를 매우 간결하게 작성할 수 있어 전체적인 가독성이 높아집니다.
- 작성 시간 단축: 코드가 간결하므로 개발 시간이 단축됩니다.
- 유지보수 용이성: 간결한 코드는 유지보수 측면에서도 유리합니다.
- 단점:
- 복잡한 코드의 가독성 저하: 간결함 때문에 복잡한 로직을 람다식으로 작성할 경우 오히려 가독성이 떨어질 수 있습니다.
결론
- 가독성 향상을 위한 선택지 추가: 람다식은 소스코드의 가독성을 높일 수 있는 새로운 방법론을 제공합니다.
- 개발자의 적절한 활용 중요: 개발자는 람다식과 기존 방식을 적절히 조합하여 가독성이 뛰어난 코드를 개발할 수 있습니다.
2. 스트림 API의 사용이 가능해졌다.
스트림 API란 컬렉션(Collection) 또는 배열과 같은 데이터를 효율적으로 처리할 수 있도록 도와주는 데이터 처리 파이프라인이다.
스트림 API의 특징은 아래와 같다.
- 데이터 흐름 중심:
- 데이터 소스(컬렉션, 배열 등)에서 한 방향으로 데이터를 처리하는 연속적인 작업 흐름을 제공
- 함수형 프로그래밍 스타일:
- 람다 표현식과 함께 사용하여 코드를 간결하게 작성할 수 있다.
- 불변성을 유지하며, 데이터를 변경하지 않고 새로운 데이터 흐름을 생성한다.
- 중간 연산과 최종 연산:
- 중간 연산(Intermediate Operation): 데이터를 변환하거나 필터링
- 최종 연산(Terminal Operation): 데이터를 집계하거나 출력
- 지연 연산(Lazy Evaluation):
- 중간 연산은 결과를 즉시 계산하지 않고, 최종 연산이 호출될 때 실행되어, 성능 최적화를 할 수 있다.
- 병렬 처리 지원:
- parallelStream()을 사용하면 데이터를 병렬로 처리하여 멀티코어 CPU의 성능을 극대화할 수 있다.
아래는 스트림 API를 사용하지 않은 코드이다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class WithoutStream {
public static void main(String[] args) {
List<String> names = List.of("Alice", "Bob", "Charlie", "Anna", "Amanda");
// 필터링 결과를 저장할 리스트 생성
List<String> filteredNames = new ArrayList<>();
for (String name : names) {
if (name.startsWith("A")) {
filteredNames.add(name.toUpperCase());
}
}
// 정렬
Collections.sort(filteredNames);
// 출력
for (String name : filteredNames) {
System.out.println(name);
}
}
}
위 코드를 보면 명령형 프로그램이 스타일로 작성이 되어 있으며, 반복문과 조건문들이 명시적으로 작성되어 있어, 코드의 길이가 길고 가독성이 떨어진다는 단점이 있으며, 정렬된 결과를 저장하기 위한 List변수가 필요하다는 단점이 존재한다.
import java.util.List;
public class WithStream {
public static void main(String[] args) {
List<String> names = List.of("Alice", "Bob", "Charlie", "Anna", "Amanda");
names.stream()
.filter(name -> name.startsWith("A")) // 조건 필터링
.map(String::toUpperCase) // 대문자로 변환
.sorted() // 정렬
.forEach(System.out::println); // 출력
}
}
하지만, 위와 같이 Stream API를 사용하여 작성을 하게 되면, 선언형 프로그래밍 작성이 가능해져서 코드가 매우 가독성이 좋아지며, 추가적으로 중간 결과를 저장하기 위한 변수 등 없이 작성이 가능하다는 장점이 있다. 또한 데이터를 처리하는 로직이 명확하게 구분된다는 장점이 있다.