Java 9 출시 : 알아야 할 모든 것

Java 9 (공식적으로 Java Platform Standard Edition 버전 9)가 드디어 출시되었으며 개발자가 JDK (Java Development Kit)를 다운로드 할 수 있습니다.

논란의 여지가있는 새로운 기능이있는 경우 몇 가지 중요한 기능이 있지만 이전 스타일의 Java 제공을위한 마지막 라인이기도합니다.

Java 9 JDK 다운로드 위치

Oracle은 개발자가 다운로드 할 수있는 Java SE 9 JDK 및 설명서를 게시했습니다.

Java 9의 새로운 주요 기능

Java SE 8이 출시 된 지 거의 3 년이 지난 후 Java SE 9에는 몇 가지 주요 아키텍처 변경 사항과 많은 개선 사항이 있습니다.

자바 9의 모듈성은 게임 체인저입니다.

Project Jigsaw에 기반한 새롭고 논란의 여지가있는 모듈화 기능은보다 보수적 인 상점이 모듈화가 성숙되기를 기다리기로 결정하더라도 JDK 9가 지금 제공해야하는 것을보고 싶어하는 최첨단 Java 상점의 관심을 불러 일으킬 것입니다.

모듈화 (Java Platform Module System 형식)는 JDK를 실행, 컴파일 또는 빌드시 결합 할 수있는 모듈 세트로 나눕니다. 모듈화를 "전 이적"변경이라고하여 모듈 간의 종속성을 이해할 수 있습니다.

Java 9의 모듈성은 개발자가 정교한 애플리케이션을보다 쉽게 ​​조립하고 유지할 수 있도록합니다. 또한 보안과 성능이 향상되는 동시에 Java가 더 작은 장치로 축소 할 수 있도록해야합니다.

Java 9의 모듈성 측면에는 애플리케이션 패키징, JDK 자체 모듈화 및 소스 코드를 모듈로 재구성하는 것이 포함됩니다. 빌드 시스템은 빌드시 모듈을 컴파일하고 모듈 경계를 적용하도록 향상되었습니다. JDK 및 JRE (Java Runtime Environment) 이미지가 모듈을 처리하도록 재구성되었습니다. 또한 JavaFX UI 컨트롤 및 CSS API는 이제 모듈화에 액세스 할 수 있습니다.

다양한 구성이 지원됩니다. 결과적으로 확장 성, 보안 및 애플리케이션 성능이 향상되어야합니다. Java를 소형 장치로 쉽게 확장하는 것이 모듈 식 노력의 핵심 동인입니다.

모듈화를 통해 개발자는 Java SE (Standard Edition) 및 Java EE (Enterprise Edition) 모두를위한 라이브러리와 대규모 애플리케이션을 더 잘 구성하고 유지할 수 있습니다. 그러나 Java 9의 개발 과정에서 Oracle, IBM, Red Hat 등은 플랫폼에서 이러한 급격한 변화를 만드는 방법에 대해 큰 의견 차이가있었습니다. 모듈 시스템 자체는 5 월에 거부되었으며, 진전이 이루어진 후 6 월에 두 번째 투표에서 승인되었습니다.

주요 Java 벤더 간의 합의에도 불구하고 모듈화가 Java 개발자에게 많은 도움이 될 것인지에 대한 논란이 남아 있습니다. 일부 전문가는 예라고, 다른 일부는 아니오라고 말합니다. 그럼에도 불구하고 Java 9는 이제 모듈화되었습니다.

모듈화 된 Java 9로 쉽게 마이그레이션 할 수 있도록 Java 9는 JRE가 클래스 및 리소스 파일을 검색하는 데 사용하는 클래스 경로의 코드에 대한 불법적 인 반사 액세스를 허용합니다. 이 기능은 Java 9 이후에 허용되지 않습니다.

Java 9 코드에 대한 컴파일러 개선

Java 9 업그레이드는 코드 컴파일을위한 몇 가지 새로운 기능을 제공하며 그중 가장 중요한 것은 AoT (Ahead-of-Time) 컴파일입니다. 아직 실험 단계에있는이 기능을 사용하면 가상 머신에서 실행되기 전에 Java 클래스를 원시 코드로 컴파일 할 수 있습니다. 이 기능은 최대 성능에 미치는 영향을 제한하면서 소규모 및 대규모 애플리케이션의 시작 시간을 개선하기위한 것입니다.

JIT (Just-in-time) 컴파일러는 빠르지 만 Java 프로그램이 너무 커져서 JIT가 완전히 워밍업하는 데 오랜 시간이 걸리고 일부 Java 메서드는 컴파일되지 않고 성능이 약화됩니다. Ahead-of-time 컴파일은 이러한 문제를 해결하기위한 것입니다.

그러나 Java 기술 공급 업체 Excelsior의 마케팅 디렉터 인 Dmitry Leskov는 사전 컴파일 기술이 충분히 성숙하지 않은 것에 대해 우려하며 Oracle이보다 견고한 버전을 위해 Java 10까지 기다리기를 바랍니다.

Java 9는 또한 Oracle의 스마트 컴파일 배포의 2 단계를 제공합니다. 이 기능은 s javac 기본적으로 JVM (Java Virtual Machine)에서 사용할 수 있도록 도구의 안정성과 이식성을 개선하는 것을 포함합니다  . 이 도구는 또한 일반화되어 JDK 외부의 대규모 프로젝트에 사용할 수 있습니다. JDK 9는 또한 javac Java 9 프로그램을 컴파일하여 일부 이전 버전의 Java에서 실행할 수 있도록 컴파일러를 업데이트했습니다  .

또 다른 새롭지 만 실험적인 컴파일 기능은 Java 레벨 JVMCI (JVM Compiler Interface)입니다. 이 인터페이스를 사용하면 Java로 작성된 컴파일러를 JVM에서 동적 컴파일러로 사용할 수 있습니다. JVMCI의 API는 VM 구조에 액세스하고, 컴파일 된 코드를 설치하고, JVM 컴파일 시스템에 연결하기위한 메커니즘을 제공합니다.

Java로 JVM 컴파일러를 작성하면 C 또는 C ++로 작성된 기존 컴파일러보다 더 쉽게 유지 관리하고 개선 할 수있는 고품질 컴파일러를 사용할 수 있습니다. 결과적으로 Java 자체로 작성된 컴파일러는 유지 보수 및 개선이 더 쉬워야합니다. 자바 내 컴파일러를 사용하기위한 다른 기존 노력으로는 Graal Project 및 Project Metropolis가 있습니다.

새로운 컴파일러 제어 기능은 JVM 컴파일러의 세분화되고 메소드 컨텍스트에 따라 달라지는 제어를 제공하여 개발자가 성능 저하없이 런타임에서 컴파일러 제어 옵션을 변경할 수 있도록합니다. 이 도구는 또한 JVM 컴파일러 버그에 대한 해결 방법을 사용합니다.

REPL이 마침내 Java 9에 등장

Java 9에는 REPL (read-eval-print loop) 도구가 포함되어 있습니다. 이는 Project Kulia에서 수년간 개발 한 끝에이 버전에서 실현되는 Java의 또 다른 장기 목표입니다.

jShell이라고하는 Java 9의 REPL은 선언문과 표현식을 대화식으로 평가합니다. 개발자는 코드 몇 줄을 입력하기 만하면 컴파일 전에 프로그램에 대한 피드백을 얻을 수 있습니다.

명령 줄 도구의 기능에는 탭 완성 및 필요한 터미널 세미콜론 자동 추가가 포함됩니다. 도구 자체는 IDE가 아니지만 jShell API는 IDE 및 기타 도구에서 jShell 기능을 허용합니다.

REPL의 부족은 학교가 Java에서 멀어지는 이유로 언급되었습니다. (Python 및 Scala와 같은 언어는 오랫동안 REPL을 사용했습니다.) 그러나 Scala 언어 창립자 Martin Odersky는 Java에서 REPL의 유용성에 대해 의문을 제기합니다. Java는 명령문 지향이고 REPL은 표현 지향적입니다.

Java 9의 Streams API 향상

Java 스트림을 사용하면 개발자가 계산을 표현하여 데이터 병렬 처리를 효율적으로 활용할 수 있습니다. Java 8의 Stream 기능은 멀티 코어 아키텍처를 활용하면서 데이터를 선언적으로 처리하기위한 것입니다.

Java 9에서 Streams API는 Streams에서 항목을 조건부로 가져 와서 삭제하고, Stream 요소를 반복하고, Streams 소스로 사용할 수있는 Java SE API 집합을 확장하면서 nullable 값에서 스트림을 생성하는 메서드를 추가합니다.

코드 캐시는 Java 9로 나눌 수 있습니다.

JDK 9를 사용하면 코드 캐시를 세그먼트로 분할하여 성능을 향상시키고 세분화 된 잠금과 같은 확장을 허용 할 수 있습니다. 비 메소드 코드를 건너 뛰는 특수 반복기로 인해 결과는 스위프 시간이 개선되어야합니다. 비 메소드, 프로파일 링 및 프로파일 링되지 않은 코드 분리 일부 벤치 마크의 실행 시간을 개선합니다. 

Project Nashorn을 통해 Java 9에서 더 나은 JavaScript 지원

Java 용 경량 JavaScript 런타임을 제공하는 Project Nashorn은 JDK 9에서 개선되고 있습니다. 프로젝트 Nashorn은 Netscape에서 시작된 Rhino 프로젝트에 이어 Java에서 고성능의 경량 JavaScript 런타임을 구현하려는 노력이었습니다. 프로젝트 Nashorn은 자바 애플리케이션에 자바 스크립트를 포함 할 수 있도록 담당했습니다. JDK 8에서 자바 스크립트 엔진과 함께 자바를 제공했습니다.

JDK 9에는 Nashorn의 ECMAScript 구문 트리를위한 파서 API가 포함되어 있습니다. API는 Project Nashorn의 내부 구현 클래스에 의존하지 않고 IDE 및 서버 측 프레임 워크에서 ECMAScript 코드 분석을 가능하게합니다.

HTTP / 2 클라이언트 API가 Java 9에 제공

베타 HTTP / 2 클라이언트 API가 JDK 9에 제공되어 웹의 핵심 HTTP 프로토콜로의 업그레이드를 Java로 구현합니다. WebSocket은 API에서도 지원됩니다.

HTTP / 2 API는 이제는 없어진 프로토콜로 설계되고, HTTP / 1보다 앞서고, 너무 추상적이며, 사용하기 어려운 등 문제가 있었던 HttpURLConnection API를 대체 할 수 있습니다.

Java 9에서 향상된 HTML5 및 유니 코드 지원

JDK 9에서는 HTML5 마크 업을 생성하도록 Javadoc 문서 도구가 향상되었습니다. 8,000 개의 문자, 10 개의 블록, 6 개의 스크립트를 추가하는 Unicode 8.0 인코딩 표준도 지원됩니다.

DTLS 보안 API가 Java 9에 추가되었습니다.

보안을 위해 Java 9는 DTLS (Datagram Transport Layer Security) 용 API를 추가합니다. 이 프로토콜은 클라이언트 / 서버 통신에서 도청, 변조 및 메시지 위조를 방지하도록 설계되었습니다. 클라이언트 및 서버 모드 모두에 대한 구현이 제공됩니다.

Java 9가 더 이상 사용하지 않고 제거하는 것

Java 9는 더 이상 유행하지 않는 여러 기능을 더 이상 사용하지 않거나 제거합니다. 그중 가장 중요한 것은 더 이상 사용되지 않는 Applet API입니다. 보안을 중시하는 브라우저 제조업체가 Java 브라우저 플러그인에 대한 지원을 제거하면서 이제 스타일이 사라졌습니다. HTML5의 출현은 또한 이들의 종말을 가져 왔습니다. 개발자는 이제 브라우저에서 응용 프로그램을 시작하거나 설치 가능한 응용 프로그램을 실행하기위한 Java Web Start와 같은 대안을 안내받습니다. 

appletviewer 도구도 더 이상 사용되지 않습니다.

Java 9는 또한 CMS (Concurrent Mark Sweep) 가비지 수집기를 더 이상 사용하지 않으며 향후 릴리스에서 지원을 중단합니다. 그 목적은 HotSpot 가상 머신에서 다른 가비지 수집기의 개발 속도를 높이는 것입니다. 일시 중지가 낮은 G1 가비지 수집기는 CMS를 장기적으로 대체하기위한 것입니다.

한편, 이전에 JDK 8에서 더 이상 사용되지 않는 가비지 수집 조합은 JDK 9에서 제거되었습니다. 여기에는 Incremental CMS, ParNew + SerialOld 및 DefNew + CMS와 같이 거의 사용되지 않는 조합이 포함되어 가비지 수집기 코드 기반에 추가 복잡성이 추가되었습니다.

Java 9는 또한 import 문에 대한 Java 경고를 제거하여 대규모 코드베이스에서 lint 경고를 제거하는 데 도움이됩니다. 이러한 코드베이스를 사용하면 더 이상 사용되지 않는 기능이 한동안 지원되어야하는 경우가 많지만 사용되지 않는 구성을 가져 오더라도 구성의 사용이 의도적이고 억제 된 경우 경고 메시지가 표시되지 않습니다.

Java 9에서는 다중 JRE (mJRE) 기능을 통해 시작시 JRE를 선택할 수있는 기능도 제거되었습니다. 이 기능은 거의 사용되지 않았고 Java 런처의 구현을 복잡하게했으며 JDK 5에서 데뷔했을 때 완전히 문서화되지 않았습니다.

Oracle은 JVM에서 대체 된 JVM TI (Tool Interface) hprof (Heap Profiling) 에이전트를 제거했습니다. jhat 도구도 제거되어 우수한 힙 시각화 도구 및 분석기에 의해 폐기되었습니다.

Java 9는 새로운 Java 9 라인이 시작됨에 따라 라인의 끝입니다.

Java 9가 모든 새로운 기능과 함께 강세를 보이고 있다고 말할 수 있습니다. 오라클은 최근 Java 9가 주요 릴리스 간의 지정 및 경과 시간 측면에서 마지막 유형이라고 밝혔다.

여기서부터 Java는 2018 년 3 월까지 Java 18.3으로, 6 개월 후 Java 18.9로 다음 메이저 버전으로 6 개월의 릴리스주기를 가질 예정입니다.

Java의 새 릴리스 케이던스는 JDK 9가 장기 지원 릴리스로 지정되지 않음을 의미합니다. 대신 다음 장기 릴리스는 Java 18.9입니다.

Java의 더 빠른 릴리스 케이던스는 개발자가 주요 릴리스를 기다릴 필요가 없다는 것을 의미합니다. 또한 개발자가 Java 9 및 "미성숙 한"모듈성 기능을 건너 뛰고 새 버전이 나올 때까지 6 개월을 기다릴 수 있습니다. 자바 툴 벤더 ZeroTurnaround의 자바 옹호 이사 인 Simon Maple은 꼬임이라고 말했다.