Java를 배우고자 시작했다면 Java 8이 가장 중요하다 라는 말을 많이 들어봤을 것이다.
현재 2n버전까지 출시된 마당에 8버전이 왜 중요하다는걸까?
그 이유는 이후의 Java업데이트들이 대부분 Java8의 개념을 확장하거나 개선한 형태이기 때문이다. 즉, Java8을 이해하면 이후의 버전의 변화도 쉽게 따라갈 수 있다는 뜻이다.
두 번의 포스팅에 걸쳐 Java 8 문법의 변화를 따라가보고자 한다.
Java 8 이전까지는 객체지향 스타일이 중심이었으나, 함수형 프로그래밍의 개념이 처음으로 도입되었다.
//기존 방식(익명 클래스 사용)
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
// Java8 람다 표현식 사용
Comparator<String> comparator = (o1, o2) -> o1.compareTo(o2);
이전 코드보다 훨씬 짧고 가독성이 좋아졌다!
8 이전에는 컬렉션을 다룰 때 반복문(Loop)을 사용해야했다.
하지만 Stream API의 사용으로 가독성과 성능이 좋아졌고, 병렬처리도 가능하게 되었다.
List<String> names = Arrays.asList("Apple", "Banana", "Avocado");
// Java 7 방식 (반복문 사용)
List<String> result = new ArrayList<>();
for (String name : names) {
if (name.startsWith("A")) {
result.add(name);
}
}
// Java 8 스트림 API 사용
List<String> resultStream = names.stream()
.filter(name -> name.startsWith("A"))
.collect(Collectors.toList());
Java 8이전에는 null체크를 직접 해야했다.
Java 8의 Optional을 사용하면 null처리를 보다 안전하게 할 수 있다.
// 기존 방식
String name = getName();
if (name != null) {
System.out.println(name.toUpperCase());
}
// Java 8 Optional 사용
Optional<String> nameOpt = Optional.ofNullable(getName());
nameOpt.ifPresent(name -> System.out.println(name.toUpperCase()));
Java 8 이전에는 Date, Calendar 클래스를 사용해야 했는데, 이 클래스들은 불변하지 않고 설계가 불편했다.
Java 8에서 LocalDate, LocalTime, LocalDateTime등을 추가하면서 날짜 처리 방식이 개선되었다.
// 기존 방식 (java.util.Date)
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(date);
// Java 8 방식 (LocalDate)
LocalDate today = LocalDate.now();
System.out.println(today); // 2024-02-18
Java8이전에는 인터페이스에 추상 메서드만 정의할 수 있었다.
하지만 Java 8에서 default method와 static method를 추가할 수 있게 되어 기존 인터페이스를 쉽게 확장 가능하다.
interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method");
}
static void staticMethod() {
System.out.println("This is a static method");
}
}