Java 9 REPL (JShell)

오라클은 쉘과 REPL(Read Evaluate Print Loop)을 위한 새로운 툴인 "JShell"을 소개한다.

이것은 자바 클래스, 인터페이스, 객체 등의 생성을 매우 쉽게 실행하고 테스트하기 위해 사용된다.


프로그래밍 언어를 구현하는 방법 중에서 인터프리터(해석기) 방식이 있다.
사용자가 입력한 프로그램을 읽고 값을 계산한 다음 출력하는 일을 반복한다.
이렇게 읽고(read), 계산하고(evaluate), 출력하는(print) 반복 구조를 REPL(read-eval-print loop)이라고 한다


다운 가능한 곳 : 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



JShell에 대해 더 잘 알고 싶다면 아래 링크를 참고.




Factory Methods for Immutable List, Set, Map and Map.Entry

불변 List, Set, Map, Map.Entry를 만들어주는 편리한 팩토리 메서드가 제공된다.

그 유틸 메서드들은 비어있거나 비어있지 않은 Collection 객체를 만드는데 사용됩니다.


자바8이나 이전 버전에서 우리는 Collections 클래스의 unmodifiableXXX와 같은 유틸 메서드를 사용해서 불변 Collection 객체를 만들었다.

그러나 그 메서드들을 이용한 방법은 지루하고 장황했다. 그 단점을 없애기 위해서 새로운 팩토리 메서드가 추가되었다.


List와 Set 인터페이스는 불변의 비어있거나 비어있지 않은 List 또는 Set을 만들어주기 위한 "of" 메서드를 갖는다.


Empty List Example

List immutableList = List.of();

Non-Empty List Example

List immutableList = List.of("one","two","three");


Map은 두 개의 메서드를 갖는다.
"of"는 비어있는 불변 맵을, "ofEntires"는 데이터를 추가해준 불변 맵을 만들어준다.

Empty Map Example

jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}

Non-Empty Map Example

jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}


위 메서드에 대해 더 자세히 알고 싶다면 아래 링크를 참고.




Private methods in Interfaces

Java8에서 Default와 Static 메서드를 이용해서 인터페이스에 구현체를 넣는 방법이 추가되었다.

하지만 private으로 구현체를 추가하는 방법이 없었기 때문에 이번에 추가되었다.

아래 메서드들에 차이는 없다.


public interface Card{

  private Long createCardID(){
    // Method implementation goes here.
  }

  private static void displayCardDetails(){
    // Method implementation goes here.
  }

}

더 알고 싶다면 아래 링크를 참고




Java 9 Module System

자바9의 큰 변화중 하나는 모듈 시스템이다.

직소 프로젝트(Jigsaw project)는 다음과 같은 특징을 갖고 있다.

  • Modular JDK
  • Modular Java Source Code
  • Modular Run-time Images
  • Encapsulate Java Internal APIs
  • Java Platform Module System


자바 SE 9 버전 전에, 우리는 자바 기반 응용 프로그램을 개발할 때 모노리틱 Jar 방식을 사용하고 있었습니다. 

이 아키텍처는 한계와 단점이 많았습니다. 이러한 모든 단점을 방지하기 위해, 자바 SE 9 모듈 시스템이 나왔습니다..


JDK 9는 92 모듈 (최종 릴리스에서 변경 될 수 있습니다)와 함께 오고 있다.

우리는 JDK 모듈을 사용할 수 있고 아래와 같이 우리 자신의 모듈을 만들 수 있습니다 :



Simple Module Example

module com.foo.bar { }


여기에서 우리는 간단한 모듈을 만드는 'module'을 사용하고 있습니다.

각 모듈의 이름, 관련 코드 및 기타 자원을 보유하고 있습니다.




Process API Improvements

자바9에서 프로세스 API를 개선하였다.

다음과 같은 두 커플 형태의 신규 클래스가 추가되었다. (OS 프로세스를 관리 및 컨트롤할 수 있는)


  • java.lang.ProcessHandle
  • java.lang.ProcessHandle.Info


Process API example

 ProcessHandle currentProcess = ProcessHandle.current();
 System.out.println("Current Process Id: = " + currentProcess.getPid());





Try With Resources Improvement

우리는 자바 7에서 새로운 자원 관리 방법(try with resource)이 나온 것을 알고 있다.

이것의 핵심 목표는 자원관리의 보다 나은 자동화이다.  자바9에서는 더 향상된 방법을 제공한다.



Java SE 7 example

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 example

void testARM_Java9() throws IOException{
 BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
 try (reader1) {
   System.out.println(reader1.readLine());
 }
}


더 많은 정보를 원하면 아래 링크를 참고




CompletableFuture API Improvements

자바8에서 CompletableFuture가 가지는 문제점을 개선하였다.



Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);

delayedExecutor()은 static 유틸 메서드로 사용된다.

주어진 시간 딜레이 이후에 기본 실행자로 보내진 new Executor를 반환한다.




Reactive Streams

아름다운 혜택들로 애플리케이션을 배포하기 위해 지금 리액티브 프로그래밍은 큰 인기를 끌고 있다.

Scala, Play, Akka 등의 프레임워크는 이미 리액티브 스트림을 구축하고 많은 혜택을 얻고 있다.

오라클은 새로운 리액티브 스트림 API를 소개한다.


자바9의 리액티브 스트림 API는 자바 언어를 이용해서 매우 쉽게 병행성, 확장성, 비동기 애플리케이션을 구현한 Publish / Subscribe 프레임워크이다.


다음은 자바 기반 애플리케이션에서 리액티브 스트림을 개발하기 위한 API이다.


  • java.util.concurrent.Flow
  • java.util.concurrent.Flow.Publisher
  • java.util.concurrent.Flow.Subscriber
  • java.util.concurrent.Flow.Processor




Diamond Operator for Anonymous Inner Class

자바 7에서 다이아몬드 오퍼레이터를 추가했지만, 자바 8에서 익명 내부 클래스 사용시 한계가 있다는 것을 찾게 되었다.

그것을 수정하였고 아래와 같은 예를 들 수 있다. 자세한 타입 파라미터 없이 단순히 "List"만을 사용하였지만 상세한 타입을 알아서 확인해서 읽어준다.



public List getEmployee(String empid){
     // Code to get Employee details from Data Store
     return new List(emp){ };
  }




Optional Class Improvements

Optional 클래스에 신규 메서드를 추가했다.

값이 Optional 객체로 주어질 때 Stream 메서드는 값과 함께 sequential stream을 리턴한다. 값이 비어 있다면 빈 스트림을 리턴한다.


다음은 Optional에서 stream의 사용 형태를 보여준다.


Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)

위 Optional.stream 메서드는 Employee 객체의 Optional 스트림을 Employee 객체 스트림으로 변환해준다.




Stream API Improvements

자바9에서 Stream 인터페이스에 사용 가능한 4개의 메서드가 추가되었다.

Stream은 인터페이스이므로 신규 구현된 메서드는 모두 default 메서드이다.

그 중 두 개는 매우 중요하다. dropWhile과 takeWhile 메서드

takeWhile은 인수로서의 predicate를 취하고 주어진 값의 스트림 서브셋을 리턴합니다.

해당 값을 만족시키는 값이 없으면 빈 스트림을 리턴합니다.



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







Enhanced @Deprecated annotation

자바8과 이전 버전에서 @Deprecated 어느테이션은 어느 메서드도 없이 단순히 마커 인터페이스였다.

Java SE 9에서 Oracle Corporation은 @Deprecated 주석을 강화하여 지원 중단 된 API에 대한 자세한 정보를 제공하고 지원 중단 된 API의 정적 사용을 분석하는 도구를 제공합니다.

forRemovalsince가 추가되었고 이 메서드들은 그 정보를 제공합니다.




HTTP 2 Client

HTTP/2 프로토콜과 WebSocket 기능을 지원하기 위해 새로운 HTTP 2 클라이언트 API가 추가된다.

기존 또는 기존 HTTP 클라이언트 API에 많은 문제점이 있으므로, 이 HttpURLConnection API를 새로운 HTTP 클라이언트로 대체하고 있습니다.


"java.net.http" 패키지 아래에 새로운 HTTP 2 클라이언트 API를 도입 할 것입니다.

HTTP / 1.1 및 HTTP / 2 프로토콜을 모두 지원합니다. 그것은 동기화(블로킹 모드)와 비동기 모드를 모두 지원합니다.

WebSocket API를 사용하여 비동기 모드를 지원합니다.


We can see this new API at: http://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html



HTTP 2 Client Example

jshell> import java.net.http.*

jshell> import static java.net.http.HttpRequest.*

jshell> import static java.net.http.HttpResponse.*

jshell> URI uri = new URI("http://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> http://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()))





Мulti-Resolution Image API

Java SE 9에서 Oracle Corp은 새로운 multi-Resolution Image API를 도입 할 예정입니다.

이 API의 중요한 인터페이스는 MultiResolutionImage입니다.

java.awt.image 패키지로 이용 가능합니다.

MultiResolutionImage는 서로 다른 높이와 너비 (해상도가 다름)의 이미지 세트를 캡슐화하고 우리가 요구 사항을 사용하여 이미지를 쿼리 할 수 있도록합니다.




Miscellaneous Java 9 Features

아래 특징들이 덜 중요한 특징은 아니지만 현재로서는 확실히 나온 정보가 많지 않음


  • GC (Garbage Collector) Improvements
  • Stack-Walking API
  • Filter Incoming Serialization Data
  • Deprecate the Applet API
  • Indify String Concatenation
  • Enhanced Method Handles
  • Java Platform Logging API and Service
  • Compact Strings
  • Parser API for Nashorn
  • Javadoc Search
  • HTML5 Javadoc



Reference

[1] Java9 Feature (http://www.journaldev.com/13121/java-9-features-with-examples)






저작자 표시 비영리 변경 금지
신고

'Software > 정리 글' 카테고리의 다른 글

Java9 특징  (0) 2016.12.12
DDD와 JPA에 대해서 알아야 하는 이유  (0) 2016.06.24
함수형 프로그래밍이 주목받는 이유  (0) 2016.04.27
적정 스레드 수  (0) 2013.05.20
Qt(Qt Development Frameworks)란 무엇인가?  (0) 2012.04.16
정규식 예제  (0) 2012.03.29
Java에서 JNI를 써서 핑 프로그램을 구현하는 이유  (0) 2012.01.30
버전 관리 & 이슈 관리 시스템  (0) 2011.06.07
C와 Java의 컴파일 과정  (1) 2011.05.27
난수 발생기  (2) 2010.06.23
SnmpWalk  (0) 2010.04.27

Leave a Comment


to Top