[Java] Java 8 문법을 알아보자. -1 (람다표현식&Stream API / Optional )

nana·2025년 2월 25일

JAVA

목록 보기
11/11

0. 왜 많고 많은 버전 중 Java 8인가?

Java를 배우고자 시작했다면 Java 8이 가장 중요하다 라는 말을 많이 들어봤을 것이다.
현재 2n버전까지 출시된 마당에 8버전이 왜 중요하다는걸까?

그 이유는 이후의 Java업데이트들이 대부분 Java8의 개념을 확장하거나 개선한 형태이기 때문이다. 즉, Java8을 이해하면 이후의 버전의 변화도 쉽게 따라갈 수 있다는 뜻이다.

두 번의 포스팅에 걸쳐 Java 8 문법의 변화를 따라가보고자 한다.

1️⃣ 함수형 프로그래밍 도입(람다 표현식 & Stream API)

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);
        

이전 코드보다 훨씬 짧고 가독성이 좋아졌다!

2️⃣ 스트림API로 데이터 처리 방식 혁신

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());
  • 코드가 간결해지고, 가독성이 향상되었다.
  • 중간 연산(map, filter)과 최종 연산(collect, forEach)을 분리하여 이해하기 쉽다.
  • parallelStream()을 사용하면 병렬처리가 가능하여 성능이 최적화 된다.

3️⃣ Optional을 통한 NPE(NullPointerException) 방지

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()));
  • NPE방지를 위한 if체크가 불필요해지고, 가독성이 좋아짐.

4️⃣ java.time 패키지로 날짜 및 시간 처리 개선

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
  • 불면객체로 설계되어 스레드 안전(Thread-Safe)하고, 사용법이 직관적이다.

5️⃣ 인터페이스에 default 및 static 메서드 추가

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");
    }
}
profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글