Java 9는 주요 릴리스이며 개발자들을 위한 다양한 기능을 제공했습니다. 이 기사에서는 Java 9의 기능을 자세히 살펴보겠습니다.
Java 10이 출시되었습니다. Java 10 릴리스의 전체 개요를 보려면 Java 10 기능을 참고하십시오.
Java 9 기능
- Java 9 REPL (JShell)
- 불변 List, Set, Map 및 Map.Entry에 대한 팩토리 메소드
- 인터페이스의 Private 메소드
- Java 9 모듈 시스템
- 프로세스 API 개선
- 리소스 사용 개선
- CompletableFuture API 개선
- 리액티브 스트림
- 익명 내부 클래스에 대한 Diamond Operator
- Optional 클래스 개선
- 스트림 API 개선
- 향상된 @Deprecated 어노테이션
- HTTP 2 클라이언트
- 다중 해상도 이미지 API
- 기타 Java 9 기능
오라클 코퍼레이션은 2017년 3월 말쯤 Java SE 9를 출시할 예정입니다. 이 게시물에서는 몇 가지 예를 들어 간단히 “Java 9 기능”을 논의하겠습니다.
Java 9 REPL (JShell)
오라클 코퍼레이션은 “jshell”이라는 새로운 도구를 소개했습니다. Java Shell의 약자이며 REPL (Read Evaluate Print Loop)로도 알려져 있습니다. 이것은 클래스, 인터페이스, 열거형, 객체, 문장 등과 같은 모든 Java 구성 요소를 매우 쉽게 실행하고 테스트하는 데 사용됩니다. JDK 9 EA (Early Access) 소프트웨어를 다음 위치에서 다운로드할 수 있습니다. https://jdk9.java.net/download/
G:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println("a value = " + a )
a value = 10
REPL 도구에 대해 더 알고 싶다면, Java 9 REPL 기본 사항 (제1부)과 Java 9 REPL 기능 (제2부)를 참조하십시오.
불변 List, Set, Map 및 Map.Entry의 팩토리 메서드
Oracle Corp는 불변 List, Set, Map 및 Map.Entry 객체를 생성하기 위한 몇 가지 편리한 팩토리 메서드를 소개했습니다. 이 유틸리티 메서드는 비어 있거나 비어 있지 않은 Collection 객체를 생성하는 데 사용됩니다. Java SE 8 및 이전 버전에서는 Collections 클래스의 유틸리티 메서드인 unmodifiableXXX
를 사용하여 불변 Collection 객체를 생성할 수 있습니다. 예를 들어, 불변 List를 생성하려면 Collections.unmodifiableList
메서드를 사용할 수 있습니다. 그러나 이러한 Collections.unmodifiableXXX
메서드는 지루하고 장황한 접근 방식입니다. 이러한 단점을 극복하기 위해 Oracle Corp는 List, Set 및 Map 인터페이스에 몇 가지 유틸리티 메서드를 추가했습니다. List 및 Set 인터페이스에는 아래에 표시된 것처럼 비어 있거나 비어 있지 않은 불변 List 또는 Set 객체를 생성하기 위한 “of()” 메서드가 있습니다: 빈 List 예제
List immutableList = List.of();
비어 있지 않은 List 예제
List immutableList = List.of("one","two","three");
Map에는 불변 Map 객체 및 불변 Map.Entry 객체를 생성하기 위한 of()
메서드와 ofEntries()
메서드 두 가지 세트의 메서드가 있습니다. 빈 Map 예제
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
비어 있지 않은 Map 예제
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
이러한 유틸리티 메서드에 대해 더 많이 알고 싶다면 다음 링크를 참조하십시오:
인터페이스 내의 개인 메서드
Java 8에서는 기본 및 정적 메서드를 사용하여 인터페이스에서 메서드 구현을 제공할 수 있습니다. 그러나 인터페이스 내에서 개인 메서드를 생성할 수는 없습니다. 중복 코드를 피하고 더 많은 재사용성을 위해 Oracle Corp는 Java SE 9 인터페이스에서 개인 메서드를 도입할 예정입니다. Java SE 9부터는 ‘private’ 키워드를 사용하여 인터페이스 내에서 개인 및 개인 정적 메서드를 작성할 수 있습니다. 이러한 개인 메서드는 다른 클래스의 개인 메서드와 유사하며 그들 사이에는 차이가 없습니다.
public interface Card{
private Long createCardID(){
// 메서드 구현이 여기에 있습니다.
}
private static void displayCardDetails(){
// 메서드 구현이 여기에 있습니다.
}
}
이 새로운 기능에 대해 더 읽으려면 다음 링크를 참조하십시오: Java 9 인터페이스 내의 개인 메서드.
Java 9 모듈 시스템
Java 9의 큰 변화 중 하나는 모듈 시스템입니다. Oracle Corp은 Jigsaw 프로젝트의 일부로 다음과 같은 기능을 소개할 예정입니다.
- 모듈형 JDK
- 모듈형 Java 소스 코드
- 모듈형 런타임 이미지
- Java 내부 API 캡슐화
- Java 플랫폼 모듈 시스템
Java SE 9 이전 버전에서는 Java 기반 응용 프로그램을 개발하기 위해 Monolithic Jars를 사용했습니다. 이 아키텍처에는 많은 제약과 단점이 있습니다. 이러한 모든 단점을 피하기 위해 Java SE 9에는 모듈 시스템이 도입되었습니다. JDK 9에는 92개의 모듈이 포함되어 있습니다 (최종 릴리스에서 변경될 수 있음). 우리는 JDK 모듈을 사용할 수 있고 아래와 같이 직접 모듈을 만들 수도 있습니다: 간단한 모듈 예제
module com.foo.bar { }
여기서 ‘module’을 사용하여 간단한 모듈을 만듭니다. 각 모듈에는 이름, 관련 코드 및 기타 리소스가 있습니다. 이 새로운 아키텍처와 실전 경험에 대한 자세한 내용은 제 원래 자습서를 참조하십시오:
프로세스 API 개선
Java SE 9에는 프로세스 API에서 몇 가지 개선 사항이 포함되어 있습니다. 운영 체제 프로세스의 제어 및 관리를 용이하게하기 위해 새로운 클래스와 메서드가 추가되었습니다. 프로세스 API에서 두 가지 새로운 인터페이스:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
프로세스 API 예제
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
리소스 사용 개선
우리는 Java SE 7이 자원을 자동으로 관리하기 위해 새로운 예외 처리 구조를 도입했다는 것을 알고 있습니다. 이 새로운 문은 “자동으로 더 나은 리소스 관리”라는 주요 목표를 가지고 있습니다. Java SE 9는 이 문을 명확성을 향상시키고 몇 가지 가독성을 향상시키기 위해 몇 가지 개선을 제공할 예정입니다. Java SE 7 예제
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Java 9 예제
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
CompletableFuture API 개선 사항
자바 SE 9에서 오라클은 자바 SE 8에서 발생한 일부 문제를 해결하기 위해 CompletableFuture API를 개선할 예정입니다. 그들은 일부 지연 및 타임아웃을 지원하고, 유틸리티 메소드 몇 개를 추가하고, 더 나은 서브클래싱을 할 것입니다.
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
여기서 delayedExecutor()는 주어진 지연 시간 이후에 기본 실행기에 작업을 제출하는 새 Executor를 반환하는 정적 유틸리티 메소드입니다.
반응형 스트림
요즘에는 반응형 프로그래밍이 애플리케이션을 개발할 때 많은 이점을 얻기 위해 매우 인기가 있습니다. Scala, Play, Akka 등의 프레임워크는 이미 반응형 스트림을 통합하여 많은 이점을 얻고 있습니다. 오라클은 또한 자바 SE 9에서 새로운 반응형 스트림 API를 소개합니다. 자바 SE 9 반응형 스트림 API는 자바 언어를 사용하여 매우 쉽게 비동기, 확장 가능 및 병렬 애플리케이션을 구현하기 위한 게시/구독 프레임워크입니다. 자바 SE 9는 자바 기반 애플리케이션에서 반응형 스트림을 개발하기 위해 다음 API를 소개했습니다.
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
익명 내부 클래스를 위한 다이아몬드 연산자
우리는 Java SE 7에서 다이아몬드 연산자를 통해 중복 코드와 장황함을 피하고 가독성을 향상시키는 새로운 기능을 소개했다는 것을 알고 있습니다. 그러나 Java SE 8에서는 Oracle Corp (자바 라이브러리 개발자)가 익명 내부 클래스와 함께 다이아몬드 연산자를 사용할 때 일부 제한 사항을 발견했습니다. 그들은 이러한 문제를 해결하고 Java 9의 일부로 릴리스할 예정입니다.
public List getEmployee(String empid){
// 데이터 저장소에서 직원 세부 정보를 가져 오는 코드
return new List(emp){ };
}
여기서는 유형 매개 변수를 지정하지 않고 “List”만 사용합니다.
Optional 클래스 개선
Java SE 9에서 Oracle Corp는 java.util.Optional 클래스에 몇 가지 유용한 새 메서드를 추가했습니다. 여기에서는 그 중 하나의 메서드를 몇 가지 간단한 예제와 함께 설명하겠습니다: stream 메서드. 주어진 Optional 객체에 값이 있는 경우이 stream() 메서드는 해당 값을 가진 연속 Stream을 반환합니다. 그렇지 않으면 빈 Stream을 반환합니다. 아래에 표시된대로 Optional 객체에서 작동하는 “stream()” 메서드를 게으르게 추가했습니다:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
여기서 Optional.stream() 메서드는 Employee 객체의 Optional Stream을 Employee의 Stream으로 변환하여 결과 코드에서이 결과를 게으르게 처리합니다. 이 기능에 대해 더 자세히 이해하려면 더 많은 예제와 함께 원래 자습서를 참조하십시오: Java SE 9: Optional Class Improvements
Stream API Improvements
Java SE 9에서 Oracle Corp는 java.util.Stream 인터페이스에 네 가지 유용한 새 메소드를 추가했습니다. Stream은 인터페이스이므로, 이러한 새로 구현된 메소드는 모두 기본 메소드입니다. 그 중 두 개는 매우 중요합니다: dropWhile 메소드와 takeWhile 메소드입니다. Scala 언어나 기타 함수형 프로그래밍 언어에 익숙하다면 이러한 메소드에 대해 이미 알고 있을 것입니다. 이러한 메소드는 함수형 스타일의 코드 작성에 매우 유용합니다. 여기서는 takeWhile 유틸리티 메소드에 대해 논의하겠습니다. takeWhile() 메소드는 프레디케이트를 인자로 받고, 해당 프레디케이트가 처음으로 false를 반환할 때까지 주어진 Stream 값의 부분집합을 Stream으로 반환합니다. 첫 번째 값이 해당 프레디케이트를 만족시키지 않으면 빈 Stream을 반환합니다.
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
takeWhile 및 dropWhile 메소드 및 기타 새 메소드에 대해 자세히 알아보려면, 원본 튜토리얼을 읽어보세요. : Java SE 9: Stream API 개선 사항
Enhanced @Deprecated annotation
Java SE 8 및 이전 버전에서 @Deprecated 주석은 어떤 메서드도 없는 마커 인터페이스입니다. 이것은 클래스, 필드, 메서드, 인터페이스, 생성자, 열거형 등이 되는 Java API를 표시하는 데 사용됩니다. Java SE 9에서 Oracle Corp는 @Deprecated 주석을 향상시켜 폐기된 API에 대한 더 많은 정보를 제공하고 폐기된 API의 정적 사용을 분석하는 도구를 제공했습니다. 이 Deprecated 인터페이스에 두 개의 메서드를 추가했습니다: forRemoval 및 since 이 정보를 제공하기 위해.
HTTP 2 Client
자바 SE 9에서 오라클은 HTTP/2 프로토콜 및 WebSocket 기능을 지원하기 위해 새로운 HTTP 2 클라이언트 API를 출시할 예정입니다. 기존의 HTTP 클라이언트 API는 HTTP/1.1 프로토콜을 지원하며 HTTP/2 프로토콜 및 WebSocket을 지원하지 않으며 블로킹 모드에서만 작동하며 많은 성능 문제가 있기 때문에 여러 문제점이 있습니다. 그래서 이 HttpURLConnection API를 새로운 HTTP 클라이언트로 대체할 예정입니다. “java.net.http” 패키지 하위에 새로운 HTTP 2 클라이언트 API를 소개할 것입니다. 이 API는 HTTP/1.1 및 HTTP/2 프로토콜을 모두 지원하며 동기 (블로킹 모드) 및 비동기 모드를 모두 지원합니다. WebSocket API를 사용하여 비동기 모드를 지원합니다. 이 새로운 API는 https://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html에서 확인할 수 있습니다. HTTP 2 클라이언트 예제
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("https://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> https://rams4java.blogspot.co.uk/2016/05/java-news.html
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
원본 자습서를 확인하려면: Java SE 9: HTTP 2 클라이언트 HTTP/2 프로토콜 및 WebSocket, 새 API의 장점 및 이전 API의 단점에 대한 유용한 예제와 함께 이해하세요.
다중 해상도 이미지 API
자바 SE 9에서 오라클은 새로운 Multi-Resolution Image API를 소개할 예정입니다. 이 API의 중요 인터페이스는 MultiResolutionImage입니다. 이는 java.awt.image 패키지에서 사용할 수 있습니다. MultiResolutionImage는 높이와 너비가 다른 이미지 세트를 캡슐화하고 우리의 요구에 따라 이를 조회할 수 있게 해줍니다.
기타 Java 9 기능
이 섹션에서는 몇 가지 기타 Java SE 9 새로운 기능을 나열할 것입니다. 이것들이 중요하지 않은 기능이라는 것은 아닙니다. 이러한 기능들도 중요하며 몇 가지 유용한 예제를 통해 잘 이해하는 것이 중요합니다. 현재까지 이러한 기능들에 대한 충분한 정보를 얻지 못했습니다. 그래서 여기에 간단한 이해를 위해 나열할 것입니다. 나는 이러한 기능들을 하나씩 선택하여 위의 섹션에 추가하고 간단한 토론과 예제를 덧붙일 것입니다. 그리고 나중에 별도의 튜토리얼을 작성할 것입니다.
- GC(가비지 컬렉터) 개선
- 스택 워킹 API
- 들어오는 직렬화 데이터 필터링
- 애플릿 API의 사용 중지
- 문자열 연결의 Indify
- 향상된 메소드 핸들
- Java 플랫폼 로깅 API 및 서비스
- 컴팩트 문자열
- Nashorn을 위한 파서 API
- Javadoc 검색
- HTML5 Javadoc
I will pickup these java 9 features one by one and update them with enough description and examples. That’s all about Java 9 features in brief with examples.
Source:
https://www.digitalocean.com/community/tutorials/java-9-features-with-examples