Oracle은 풍부한 신규 기능과 다양한 개선 사항을 담아 Java 9를 출시했습니다. 이번 버전은 단순한 업데이트를 넘어, 자바 플랫폼의 구조 자체를 바꾼 모듈 시스템 도입과 개발 생산성을 크게 높여주는 여러 도구들이 포함된 것이 특징입니다.
아래에서 Java 9의 대표적인 기능과 개선 사항을 하나씩 살펴보겠습니다.
Java 9 주요 기능 및 개선 사항
1. 컬렉션 팩토리 메서드 (Collection Factory Methods)
팩토리 메서드는 불변(수정 불가능) 컬렉션 인스턴스를 손쉽게 생성할 수 있도록 제공되는 특수한 정적 메서드입니다. List.of(), Set.of(), Map.of()를 활용하면 기존처럼 요소를 하나씩 추가하는 번거로운 작업 없이 리스트(List), 셋(Set), 맵(Map)을 한 줄로 생성할 수 있습니다.
2. 자바 플랫폼 모듈 시스템 (JPMS)
Java Platform Module System(JPMS)은 Java 9의 가장 큰 변화입니다. 자바 애플리케이션과 패키지들을 하나의 모듈(Module)로 묶어 관리할 수 있는 메커니즘으로, module-info.java 파일을 통해 어떤 패키지를 외부 모듈에 공개할지 명시적으로 지정합니다. 이를 통해 캡슐화가 강화되고, JDK의 경량화와 안정적인 의존성 관리가 가능해졌습니다.
3. 인터페이스의 private 메서드
Java 9부터는 인터페이스 내부에 private 및 private static 메서드를 정의할 수 있습니다. 이를 통해 인터페이스의 default 메서드들 간에 중복 로직을 private 메서드로 추출해 재사용할 수 있어 코드 재사용성이 크게 향상되었습니다.
4. JShell (Java REPL)
JShell은 명령줄에서 실행되는 REPL(Read-Evaluate-Print Loop) 도구입니다. 콘솔에서 JShell을 실행하면 클래스나 메서드 선언 없이도 자바 코드를 즉시 입력하고 결과를 확인할 수 있어, 학습과 간단한 코드 테스트에 매우 유용합니다.
5. try-with-resources 개선
Java 7에서 도입된 try-with-resources는 사용이 끝난 리소스를 자동으로 닫아주는 기능입니다. Java 9에서는 try 블록 밖에서 선언된 final 또는 사실상 final(effectively final) 변수도 리소스로 사용할 수 있도록 개선되어 코드가 더욱 간결해졌습니다.
6. 익명 내부 클래스의 다이아몬드 연산자
Java 9부터는 익명 내부 클래스(Anonymous Inner Class) 생성 시에도 다이아몬드 연산자(<>)를 사용할 수 있습니다. 타입 추론이 적용되어 중복된 제네릭 타입 선언을 줄일 수 있습니다.
7. CompletableFuture API 개선
Java 8에서 지적되었던 CompletableFuture의 문제점들이 개선되었습니다. 지연(delay)과 타임아웃(timeout) 처리를 위한 메서드, 편리한 유틸리티 메서드들이 추가되었고, 서브클래싱(sub-classing)도 더욱 수월해졌습니다.
8. 리액티브 스트림 (Reactive Streams)
Reactive Stream API는 발행-구독(Publish-Subscribe) 방식의 프레임워크로, 자바 언어만으로 비동기, 확장 가능, 병렬 처리 애플리케이션을 손쉽게 구현할 수 있도록 지원합니다.
9. Process API 개선
운영체제 프로세스를 제어하고 관리하는 Process API가 크게 향상되었습니다. 새롭게 추가된 ProcessHandle 클래스를 통해 프로세스의 네이티브 PID, 시작 시간, 누적 CPU 사용 시간, 실행 인수, 명령어, 사용자, 부모 프로세스 및 자식 프로세스 정보를 손쉽게 조회할 수 있습니다.
10. Optional 클래스 개선
Java 9에서는 Optional 클래스에 세 가지 핵심 메서드가 추가되었습니다.
- Optional.ifPresentOrElse(): 값이 있을 때와 없을 때의 동작을 각각 지정
- Optional.or(): 값이 없을 경우 대체 Optional을 반환하는 Supplier 지정
- Optional.stream(): Optional을 Stream으로 변환하여 스트림 파이프라인과 연동
11. Stream API 개선
Stream 인터페이스에도 새로운 메서드들이 추가되었습니다. takeWhile(), dropWhile(), ofNullable(), 그리고 오버로드된 iterate() 메서드를 활용하면 스트림 요소를 조건에 따라 잘라내거나, null을 안전하게 처리하는 등 더욱 유연한 연산이 가능합니다.
12. 멀티 해상도 이미지 API (Multi-Resolution Image API)
Multi-Resolution Image API는 서로 다른 너비(width)와 높이(height)를 가진 여러 이미지를 하나의 객체로 캡슐화합니다. 화면 해상도나 DPI 환경에 따라 요구 사항에 맞는 적절한 이미지를 조회하여 사용할 수 있습니다.
13. HTTP/2 클라이언트
HTTP/2는 서버와 클라이언트 간 데이터 프레이밍 및 전송 방식이 개선된 최신 HTTP 프로토콜입니다. Java 9에서는 HTTP Client가 인큐베이터(incubator) 모듈 형태로 제공되며, 하위 호환성(backward compatibility)을 유지하면서 HTTP/2를 지원합니다.
14. @Deprecated 어노테이션 강화
@Deprecated 어노테이션이 개선되어, 폐기 예정인 API에 대해 제거 예정 여부(forRemoval)와 폐기된 버전(since) 같은 더 상세한 정보를 제공할 수 있습니다. 또한 애플리케이션 내에서 deprecated API의 정적 사용 현황을 분석할 수 있는 도구도 함께 제공됩니다.
마무리
Java 9는 모듈 시스템이라는 큰 그림과 함께, 개발자의 일상적인 코딩 경험을 개선하는 다양한 기능들을 담고 있습니다. 특히 JShell, 컬렉션 팩토리 메서드, Stream·Optional API 개선은 실무 생산성에 즉각적인 도움을 주므로, Java 8 이후 버전으로 전환을 고려하고 있다면 반드시 확인해 볼 가치가 있습니다.