Java 9(1.9)은 Java의 장기적인 발전을 위한 중요한 릴리스였습니다. 특히, 모듈 시스템(Jigsaw 프로젝트) 도입을 비롯하여 성능 향상, API 개선, 프로세스 제어 기능 추가 등 다양한 변경 사항이 포함되었습니다. 본 포스트에서는 Java 9에서 추가된 주요 기능을 정리하고, 개발자들에게 어떤 영향을 미치는지 설명하겠습니다.
1. Java Platform Module System (JPMS, 모듈 시스템)
가장 큰 변화 중 하나는 바로 모듈 시스템의 도입입니다. 기존의 Java는 클래스 패스(Classpath) 기반으로 애플리케이션을 구성했지만, 이 방식은 충돌 문제와 유지보수의 어려움을 초래했습니다. Java 9에서는 Jigsaw 프로젝트를 통해 모듈 시스템을 도입하여 코드의 재사용성과 보안성을 높였습니다.
1.1 모듈 시스템의 주요 개념
- module-info.java: 모듈의 정의 파일로, 해당 모듈에서 사용할 패키지를 선언합니다.
- exports: 모듈이 외부에 제공하는 패키지를 지정합니다.
- requires: 다른 모듈에서 필요한 모듈을 지정합니다.
module com.example.app {
requires java.base;
exports com.example.api;
}
이를 통해 필요 없는 의존성을 제거하고, 애플리케이션을 더 구조적으로 관리할 수 있습니다.
2. JShell (REPL - Read Eval Print Loop) 도입
Java 9에서는 JShell이라는 REPL 도구가 추가되었습니다. 이는 Python, JavaScript 등의 언어에서 제공하는 대화형 인터프리터와 유사하게 Java 코드를 즉시 실행하고 테스트할 수 있도록 해줍니다.
jshell> int a = 10;
jshell> System.out.println(a * 2);
20
JShell을 활용하면 코드 실행 시간을 단축하고, 빠른 프로토타이핑이 가능해졌습니다.
3. Stream API 개선
Java 8에서 도입된 Stream API는 함수형 프로그래밍을 쉽게 구현할 수 있도록 도와주었는데, Java 9에서는 새로운 메서드가 추가되었습니다.
- takeWhile() : 조건이 참인 동안 요소를 가져옴
- dropWhile() : 조건이 처음으로 거짓이 되는 시점 이후의 요소를 반환
- ofNullable() : null 값을 처리할 수 있도록 해줌
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
numbers.stream()
.takeWhile(n -> n < 4)
.forEach(System.out::println);
// 출력: 1, 2, 3
이러한 추가 기능은 불필요한 데이터를 필터링하고 더 효율적인 스트림 처리를 가능하게 합니다.
4. HTTP/2 클라이언트 API 추가
Java 9에서는 새로운 HTTP 클라이언트 API가 추가되었습니다. 기존의 HttpURLConnection보다 비동기 프로그래밍을 지원하며 성능이 개선되었습니다.
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
HTTP/2 프로토콜을 지원하여 더 빠르고 효율적인 네트워크 통신이 가능해졌습니다.
5. Process API 개선
기존 Java에서 운영 체제의 프로세스를 제어하는 것은 어렵고 비효율적이었습니다. Java 9에서는 ProcessHandle API를 추가하여 현재 실행 중인 프로세스를 쉽게 제어할 수 있도록 개선되었습니다.
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID: " + currentProcess.pid());
이를 활용하면 운영 체제에서 실행되는 프로세스를 제어하거나 모니터링하는 것이 훨씬 쉬워집니다.
6. Immutable Collections Factory Methods (불변 컬렉션 팩토리 메서드)
Java 9에서는 불변 컬렉션을 쉽게 생성할 수 있도록 새로운 팩토리 메서드가 추가되었습니다.
List<String> list = List.of("A", "B", "C");
Set<String> set = Set.of("X", "Y", "Z");
Map<Integer, String> map = Map.of(1, "One", 2, "Two");
이전에는 Collections.unmodifiableList() 등을 사용해야 했지만, 이제는 더 간결하게 불변 컬렉션을 생성할 수 있습니다.
7. G1 GC 기본 설정
Java 9에서는 가비지 컬렉터(GC)의 기본값이 G1 GC로 변경되었습니다. 이는 더 나은 성능과 낮은 지연 시간(low latency)을 제공하여 애플리케이션의 응답 속도를 개선하는 역할을 합니다.
-XX:+UseG1GC
G1 GC는 대규모 애플리케이션에서 특히 효과적인 메모리 관리 기능을 제공합니다.
8. Multi-Release JAR 파일 지원
이제 하나의 JAR 파일에서 여러 Java 버전에 맞는 클래스를 포함할 수 있습니다. 이를 통해 하위 호환성을 유지하면서도 최신 기능을 활용할 수 있습니다.
META-INF/versions/9/com/example/MyClass.class
이 기능을 활용하면 Java 8과 Java 9 이상 버전을 동시에 지원하는 라이브러리를 배포할 수 있습니다.
결론
Java 9(1.9)는 단순한 업데이트가 아닌, Java 생태계의 중요한 변화를 가져온 버전입니다. 특히, 모듈 시스템 도입을 통해 대규모 프로젝트의 유지보수를 더욱 쉽게 만들었으며, JShell, HTTP/2 클라이언트, 스트림 API 개선 등 개발자의 생산성을 높이는 기능들이 추가되었습니다.
Java 9 이후에도 Java는 꾸준히 발전해왔으며, 최신 Java 버전을 적극적으로 활용하면 더욱 효율적인 애플리케이션 개발이 가능합니다. 앞으로도 Java의 변화에 주목하며 새로운 기능들을 활용해 보시기 바랍니다!