Java 9 – 새로운 Java 기능에 대해 알아야 할 모든 것
게시 됨: 2018-04-24접근성이 높은 프로그래밍 언어인 Java는 전 세계 개발자들에게 쉬운 일이었습니다. 1995년에 시작된 이래로 이 언어는 다양한 산업 분야에서 널리 사용되었습니다.
오늘날 휴대전화에서 Java를 찾을 수 있습니다. Android OS와 Android가 제공하는 무수히 많은 앱을 구동합니다. 거대한 플레이어 기반을 가진 Minecraft와 같은 게임을 개발하는 데 사용됩니다. 또한 상점에서 신용 카드 정보를 읽고 시스템과 은행 간에 정보를 제공하는 것과 같은 비즈니스 응용 프로그램에서도 사용됩니다.
3년의 공백 후 Java는 새 버전인 Java SE 9를 출시했습니다. 몇 가지 주요 아키텍처 변경 및 추가 기능을 통해 Java SE 9는 개발자가 갈망해 왔던 강력한 솔루션을 제공합니다.
Java 7은 2011년에 try-with-resource를 추가하여 더 나은 리소스 관리 기능을 제공합니다.
Java 8은 람다 표현식을 추가했는데, 이는 좋은 움직임이지만 OOP 패러다임에서 약간의 결함이 있습니다.
이제 Java 솔루션 을 통해 프로그래머는 개인 메서드를 사용할 수 있습니다. 개인 정적 메서드! 예, 당신은 그것을 올바르게 읽었습니다!
Java SE 8은 개발자들의 엇갈린 감정과 함께 많은 구조적 변화를 제공했습니다. 주로 Java SE 9가 극복하려고 시도한 Java SE 8의 단점은 다음과 같습니다.
- JDK는 소형 컴퓨팅 장치에서 탐색할 수 없었습니다.
- 애플리케이션 성능이 전반적으로 향상되지 않았습니다.
- JDK의 전반적인 보안 및 유지 관리가 없었습니다.
- Java 개발자는 코드 라이브러리와 더 큰 애플리케이션을 구축하고 유지하는 데 어려움을 겪었습니다.
따라서 Java 9가 이전 버전에 비해 제공하는 주요 변경 사항 및 개선 사항을 살펴보겠습니다.
Java 9에서 API 업데이트 처리
전통적으로 Java의 API는 본질적으로 원시적이었습니다. 새로운 프로세스를 시작하고 출력 및 오류 스트림을 리디렉션하도록 지원합니다. Java 9에서 Process API에 대한 새로운 업데이트는 다음을 가능하게 합니다.
- 현재 및 기타 JVM 프로세스의 PID 가져오기
- 하위 프로세스 관리
- 하위 프로세스 관리
- 시스템에서 실행 중인 프로세스의 PID, 이름 및 리소스 사용량과 같은 정보를 가져옵니다.
이것은 현재 PID와 현재 프로세스 정보를 인쇄하는 샘플 코드입니다.
public class NewFeatures
{
public static void main(String [] args)
{
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID:"+ currentProcess.getPid());
ProcessHandle.Info currentProcessInfo = currentProcess.info();
System.out.println("Info:" + currentProcessInfo);
}
}
Java 9의 HTTP/2 클라이언트
이 기능은 후속 릴리스에서 개선되거나 완전히 제거될 수도 있습니다.
이전에는 개발자가 Apache HTTP, Jersey 등과 같은 타사 라이브러리에 의존했습니다. Java의 HTTP API는 HTTP/1.1 사양보다 앞서 있으며 동기식이며 유지 관리가 어렵습니다. 이러한 제한으로 인해 새 API를 추가해야 했습니다. 새 HTTP 클라이언트 API는 다음을 제공합니다.
- 대부분의 HTTP 요청을 처리하는 간단하고 간결한 API
- HTTP/2 사양 지원
- 더 나은 성능
- 더 나은 보안
- 몇 가지 추가 개선 사항
다음은 새 API를 사용하여 HTTP GET 요청을 수행하는 코드 스니펫입니다. 이것은 module-info.java 파일에 정의된 모듈입니다.
module newfeatures{
requires jdk.incubator.httpclient;
}
다음 코드는 HTTP 클라이언트 API를 사용합니다. 이것은 jdk.incubator.httpclient 모듈의 일부입니다:
import jdk.incubator.http.*;
import java.net.URI;
public class Http2Feature{
public static void main(String[] args) throws Exception{
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest
.newBuilder(new URI(http://httpbin.org/get;))
.GET()
.version(HttpClient.Version.HTTP_1_1)
.build();
HttpResponse.String response = client.send(request,
HttpResponse.BodyHandler.asString());
System.out.println("Status code:" + response.statusCode());
System.out.println("Response Body:" + response.body());
}
}
}
Java 9의 추가 동시성 업데이트 기능
Java 9에서는 발행-구독 프레임워크의 구현을 지원하는 java.util.concurrent.Flow라는 새 클래스가 도입되었습니다. 이 프레임워크를 통해 개발자는 구성 요소를 빌드할 수 있습니다. 이러한 구성 요소는 데이터를 생성하는 게시자와 데이터를 소비하는 구독자를 설정하여 데이터의 라이브 스트림을 비동기적으로 사용할 수 있습니다. 다음은 새로운 인터페이스입니다.
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Subscription
- java.util.concurrent.Flow.Processor(게시자와 구독자 모두 역할을 함).
Java 9의 Java 쉘 스크립팅(Read-Eval-Print-Loop)
Project Kulla의 목표는 Java 9용 REPL(Read-Eval-Print-Loop) 도구의 추가를 조사하는 것이었습니다. 이 Java 릴리스에는 JShell이라는 특수 명령줄 도구가 있습니다. 여기서 목표는 REPL의 사용을 대중화하고 최대화하는 것입니다. 그래서 그게 무슨 뜻이야? 이제 실행하기 위해 몇 줄의 코드를 별도의 메서드로 래핑할 필요가 없습니다. 효율적인? 나는 찬성.
예를 들어, 스칼라에서 간단한 Hello World 프로그램은 scala>println("Hello World");
다음 이미지와 같이 JShell 명령을 실행해 보겠습니다.
Java 9의 프로젝트 퍼즐
Java 9의 새로운 기능 중 가장 중요한 것은 aall-newmodule 시스템입니다. 복잡한 시스템을 만들려면 종종 모호성을 초래하는 높은 수준의 복잡한 코드가 필요합니다. 코드 복잡성으로 인해 두 가지 근본적인 문제가 발생합니다. 코드의 캡슐화가 어렵고 시스템의 서로 다른 JAR 파일 간에 명시적 종속성에 대한 개념이 없습니다. 모든 공용 클래스는 클래스 경로의 다른 공용 클래스에서 액세스할 수 있습니다. 이로 인해 공개 API가 아닌 클래스가 불필요하게 사용됩니다. 또한 클래스 경로 자체에 문제가 있습니다. 필요한 모든 JAR이 있는지 여부를 어떻게 알 수 있습니까? 중복 항목은 어떻습니까? 모듈 시스템은 두 가지 문제를 모두 해결합니다.
이것은 Java 9의 강력한 특성이 보이는 곳입니다. 모듈식 JAR 파일에는 추가 모듈 설명자가 포함되어 있습니다. 이 모듈 설명자에서 `requires` 문은 다른 모듈에 대한 종속성을 표현하는 데 사용됩니다. 또한 `exports` 문은 다른 모듈에 액세스할 수 있는 패키지를 제어합니다. 기본적으로 내보내지 않은 모든 패키지는 모듈에 캡슐화됩니다.
이 프로젝트의 일부인 다양한 JEP는 다음과 같습니다.
JEP 200 – 모듈식 JDK: 컴파일 타임, 빌드 타임 또는 런타임에 결합할 수 있는 JDK를 모듈화하기 위해 Java 플랫폼 모듈 시스템을 적용합니다.
JEP 201 – 모듈식 소스 코드: 모듈을 생성하는 데 사용되며 생성된 모듈을 컴파일하는 빌드 도구를 허용합니다.
JEP 220 – 모듈식 런타임 이미지: 이 JEP는 모듈을 수용하도록 JDK 및 JRE 런타임 이미지를 재구성하여 성능, 보안 및 유지 관리성을 향상시킵니다.
JEP 282 – Java 링커로 알려진 jlink: 패키지 모듈로 사용 및 더 적은 런타임으로 종속성.
다중 릴리스 JAR 파일
최신 버전에서 Java 플랫폼의 새로운 기능을 활용하려면 라이브러리 개발자가 라이브러리의 최신 버전을 릴리스해야 합니다. 머지 않아 개발자가 유지 관리하는 여러 버전의 라이브러리가 있게 되며 이는 치명적일 수 있습니다. 이러한 제한을 극복하기 위해 Java 9에는 JAR 파일의 다중 릴리스 기능이 있어 개발자가 다양한 Java 버전에 대해 다양한 버전의 클래스 파일로 JAR 파일을 빌드할 수 있습니다. 이 예를 살펴보십시오.
다음과 같은 현재 JAR 파일의 그림:
항아리 루트
– 에이클래스
– B. 클래스
– 씨클래스
다중 릴리스 JAR 파일의 모양은 다음과 같습니다.
항아리 루트
– 에이클래스
– B. 클래스
– 씨클래스
– 메타-INF
– 버전
– – 9
– – – – A.클래스
– – 10
– – – – B. 클래스
이전 그림에서 JAR 파일은 2개의 Java 버전 9 및 10에 대한 클래스 파일을 지원했습니다. 따라서 JAR을 Java 버전 9에서 실행할 때 버전 9 폴더 아래의 A.class를 선택하여 실행합니다.
다중 릴리스 JAR 파일을 지원하지 않는 이전 버전의 Java에서는 버전 디렉토리 아래의 클래스가 사용되지 않습니다. 따라서 Java 8에서 다중 릴리스 JAR 파일을 실행하면 간단한 JAR 파일을 실행하는 것과 같습니다.
제 생각에는 Java로 상황이 바뀌기 시작했습니다. 그리고 이것은 성장하는 추세입니다. Java의 인기와 사용이 영향을 받는다는 의미인가요? 별말씀을요. Java는 오늘날 기술 산업에서 믿을 수 없을 정도로 강력하고 강력한 프로그래밍 언어였습니다. Java 학습을 시작하고 이것이 경력에 도움이 되는 것을 지켜보십시오. 행운을 빕니다!
저자의 메모:
해당 기술 기사는 DevOps, Big Data 및 Python과 같은 최신 기술에 대해 작동하는 Sumit에서 기고했습니다. 그리고 Edureka의 디지털 마케팅 팀에서.