JAVA

[JAVA] JAVA 9 주요 변경점

민덕이 2024. 9. 14. 21:00

Java 9의 주요 변경사항 총정리

Java 9은 2017년 9월에 출시된 메이저 업데이트로, 많은 새로운 기능과 개선사항을 도입했습니다. 이번 포스트에서는 Java 9의 주요 변경사항들을 자세히 살펴보겠습니다.

1. 모듈 시스템(Java Platform Module System) 도입

Java 9의 가장 큰 변화는 모듈 시스템의 도입입니다. 이를 통해 Java 플랫폼을 모듈화하고 애플리케이션을 모듈 단위로 개발할 수 있게 되었습니다.
주요 특징:

  • 모듈은 관련 패키지와 리소스를 그룹화하고 의존성을 명시적으로 선언합니다.
  • module-info.java 파일을 통해 모듈을 정의합니다.
  • 캡슐화를 강화하여 내부 API의 사용을 제한할 수 있습니다.
  • 의존성 관리가 개선되어 대규모 애플리케이션 개발이 용이해집니다.

예시 코드:

module com.myapp {
    requires java.base;
    exports cohttp://m.myapp.api;
}

2. JShell 도구 추가

JShell은 Java용 대화식 REPL(Read-Eval-Print Loop) 도구입니다.
주요 특징:

  • 복잡한 설정 없이 Java 코드를 즉시 실행하고 결과를 확인할 수 있습니다.
  • 새로운 API나 라이브러리를 빠르게 테스트할 수 있습니다.
  • 교육 목적으로 활용하기 좋습니다.

사용 예:

jshell> System.out.println("Hello, JShell!")
Hello, JShell!

jshell> int x = 5
x ==> 5

jshell> x * 2
$3 ==> 10

3. 컬렉션 팩토리 메서드

Java 9에서는 불변 컬렉션을 쉽게 생성할 수 있는 팩토리 메서드가 추가되었습니다.
주요 메서드:

  • List.of()
  • Set.of()
  • Map.of()

예시 코드:

List<String> list = List.of("a", "b", "c");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("one", 1, "two", 2);

4. 인터페이스에 private 메서드 허용

Java 9부터 인터페이스 내에 private 메서드를 정의할 수 있게 되었습니다.
장점:

  • 인터페이스 내 코드 중복을 줄일 수 있습니다.
  • default 메서드와 static 메서드의 로직을 더 잘 구조화할 수 있습니다.

예시 코드:

public interface MyInterface {
    default void publicMethod() {
        privateMethod();
    }

    private void privateMethod() {
        System.out.println("This is a private method");
    }
}

5. try-with-resources 문 개선

Java 9에서는 try-with-resources 문을 더 간결하게 작성할 수 있게 되었습니다.
변경 전:

BufferedReader reader1 = new BufferedReader(new FileReader("file.txt"));
try (BufferedReader reader2 = reader1) {
    // 코드
}

변경 후:

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) {
    // 코드
}

6. 스트림 API 개선

Java 9에서는 스트림 API에 몇 가지 유용한 메서드가 추가되었습니다.
새로운 메서드:

  • takeWhile(): 조건을 만족하는 요소들을 취합니다.
  • dropWhile(): 조건을 만족하지 않는 첫 요소부터 스트림을 구성합니다.
  • ofNullable(): null이 될 수 있는 단일 요소로 스트림을 생성합니다.

예시 코드:

Stream.of(1, 2, 3, 4, 5)
      .takeWhile(n -> n < 4)
      .forEach(System.out::println); // 출력: 1, 2, 3

Stream.ofNullable(null).count(); // 결과: 0

7. HTTP/2 클라이언트 API 추가

Java 9에서는 새로운 HTTP 클라이언트 API가 추가되었습니다. 이 API는 HTTP/2 프로토콜을 지원합니다.
주요 특징:

  • 비동기 요청을 지원합니다.
  • 스트림을 통한 요청과 응답 처리가 가능합니다.
  • WebSocket을 지원합니다.

예시 코드:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.example.com"))
      .build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println);

8. 프로세스 API 개선

Java 9에서는 운영 체제 프로세스를 더 쉽게 관리할 수 있도록 Process API가 개선되었습니다.
새로운 기능:

  • 현재 프로세스의 PID를 얻을 수 있습니다.
  • 부모 프로세스 정보를 얻을 수 있습니다.
  • 프로세스 트리를 탐색할 수 있습니다.

예시 코드:

ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current PID: " + currentProcess.pid());

9. Javadoc 개선

Java 9에서는 Javadoc 도구가 크게 개선되었습니다.
주요 변경사항:

  • HTML5 지원이 추가되었습니다.
  • 검색 기능이 내장되었습니다.
  • Javadoc 출력에 모듈 정보가 포함됩니다.

10. G1 가비지 컬렉터를 기본 GC로 변경

Java 9부터는 G1(Garbage-First) 가비지 컬렉터가 기본 GC로 설정되었습니다.
G1 GC의 장점:

  • 대용량 힙 메모리에서 짧은 GC 중지 시간을 제공합니다.
  • 자동으로 힙 크기를 조절합니다.
  • 병렬, 병행 수집을 수행하여 성능을 최적화합니다.

11. 다이아몬드 연산자(<>) 익명 클래스에서 사용 가능

Java 9에서는 다이아몬드 연산자를 익명 클래스에서도 사용할 수 있게 되었습니다.
예시 코드:

Comparator<String> comparator = new Comparator<>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
};

결론

Java 9는 모듈 시스템 도입, 개발 생산성 향상을 위한 도구 추가, API 개선 등 다양한 측면에서 큰 발전을 이루었습니다. 이러한 변화들은 Java 생태계를 더욱 강력하고 유연하게 만들어주었으며, 개발자들에게 더 나은 개발 경험을 제공하고 있습니다.