본문 바로가기
개발자 로그

Java 8 vs Java 7 기능 비교 정리 (Optional, Stream, Decoder 등)

by Hello_World_! 2025. 7. 16.
반응형

 

 

Java 7과 Java 8의 주요 차이 개요

Java 7은 안정성과 보안 위주의 업데이트가 중심이었지만, Java 8은 함수형 프로그래밍 도입과 API 확장을 통해 Java 언어의 패러다임 자체를 바꾼 버전입니다. Java 8부터는 람다(lambda), Stream API, java.time 패키지, Optional, Base64 등 다양한 기능이 도입되어 코드의 간결성, 가독성, 안전성이 대폭 향상되었습니다. 특히 NullPointerException을 줄이기 위한 Optional, for-each 반복을 대체하는 Stream, 복잡한 날짜 처리를 개선한 java.time.LocalDate 등이 대표적입니다. 반면 Java 7은 try-with-resources나 switch문에서 문자열 사용 등의 개선점이 있었지만, 함수형 프로그래밍 지원이 없고 유틸성 클래스도 한정적이었습니다.

Optional 클래스: NPE 방지의 진화

Java 7에서는 null 체크를 직접 하거나 if (obj != null) 같은 조건문으로 방어 코드를 작성해야 했습니다. 이는 코드가 장황해지고 실수로 인한 NullPointerException(NPE)을 유발할 가능성이 컸습니다. Java 8에서는 java.util.Optional 클래스가 도입되어, null 대신 Optional로 감싸 안전하게 값을 처리할 수 있게 되었습니다. 예를 들어 Optional.ofNullable(obj).orElse(defaultValue)와 같은 형태로 null-safe 로직을 작성할 수 있고, isPresent(), ifPresent(), orElseGet() 등을 통해 가독성 좋은 코드를 만들 수 있습니다.

[Optional 비교 코드 예제]

// Java 7 방식
String name = null;
String result = (name != null) ? name : "기본값";

// Java 8 방식
Optional<String> name = Optional.ofNullable(null);
String result = name.orElse("기본값");

Stream API: 반복을 선언형으로

Java 7에서는 배열, 리스트, 맵 등 컬렉션을 다룰 때 for-each 또는 for문을 통해 명령형 방식으로 데이터를 순회하거나 필터링해야 했습니다. 하지만 Java 8에서는 Stream API가 도입되어 선언형 방식으로 데이터를 처리할 수 있게 되었습니다. 예를 들어 리스트에서 조건에 맞는 값을 필터링하고 정렬한 후 출력하려면 Java 7에선 반복문과 조건문을 조합해야 하지만, Java 8에서는 list.stream().filter(...).sorted().forEach(...) 한 줄로 처리할 수 있습니다.

[Stream 비교 코드 예제]

// Java 7 방식
List<String> names = Arrays.asList("Kim", "Lee", "Park");
for (String name : names) {
    if (name.startsWith("K")) {
        System.out.println(name);
    }
}

// Java 8 방식
names.stream()
     .filter(name -> name.startsWith("K"))
     .forEach(System.out::println);

Base64 인코딩/디코딩 차이

Base64 인코딩 및 디코딩 기능은 Java 8 이전까지는 외부 라이브러리(Apache Commons Codec 등)에 의존해야 했습니다. Java 7에서는 Base64로 문자열을 인코딩하려면 Apache 라이브러리를 import해서 사용해야 했지만, Java 8에서는 java.util.Base64 클래스를 통해 바로 처리할 수 있습니다. JWT, OAuth 토큰 등의 통신 처리에서도 편의성이 대폭 향상됩니다.

[Base64 비교 코드 예제]

// Java 7 (Apache Commons Codec 필요)
byte[] encoded = Base64.encodeBase64("hello".getBytes());
System.out.println(new String(encoded));

// Java 8
String encoded = Base64.getEncoder().encodeToString("hello".getBytes());
System.out.println(encoded);

Lambda 표현식과 함수형 프로그래밍

Java 8의 가장 큰 변화 중 하나는 람다(lambda) 표현식입니다. Java 7까지는 Runnable, Comparator 등에서 항상 익명 내부 클래스를 만들어야 했지만, Java 8부터는 함수형 인터페이스를 기반으로 간결하게 구현할 수 있습니다. 예를 들어 Runnable은 () -> System.out.println("Hello")처럼 단 한 줄로 작성이 가능하며, 코드 가독성과 유지보수성이 크게 향상됩니다.

[Lambda 비교 코드 예제]

// Java 7
Runnable r1 = new Runnable() {
    public void run() {
        System.out.println("Hello from Java 7");
    }
};

// Java 8
Runnable r2 = () -> System.out.println("Hello from Java 8");

Java 8 vs Java 7 핵심 기능 비교표

기능 항목 Java 7 Java 8
Optional 없음 (null 체크 수동) Optional 클래스 내장 지원
Stream API for/foreach로 반복 처리 선언형 스트림 처리 지원
Base64 처리 Apache Commons 등 외부 라이브러리 필요 java.util.Base64 내장
람다 표현식 익명 내부 클래스 사용 함수형 람다식 지원
날짜/시간 API java.util.Date 사용 java.time (LocalDate 등) 제공

✔️ Java 8은 코드의 간결성, 안정성, 함수형 프로그래밍 등 현대적 개발 패턴을 지원합니다. 실무에서는 가능하면 Java 8 이상을 사용하고, 하위 호환이 필요한 경우 외부 유틸로 보완하세요.