JAVA 9 NEW FEATURE 정리

DYKO·2023년 3월 26일
0

JAVA NEW FEATURES

목록 보기
2/4

Java Platform Module System 도입

JPMS 배경

  • Java 플랫폼은 이전까지 모놀리식 아키텍처로 구성
    (주1. 모놀리식 아키텍처: 단일 코드 베이스의 애플리케이션)
  • Java 플랫폼의 규모가 커지며 모놀리식 아키텍처의 단점 부각
    • 유지보수의 어려움
    • 유연하지 않은 확장성
    • 대규모 팀 작업에서의 불편함
    • 기술 변경에 대한 제한
    ➡ 모듈화 필요성 증대, Jigsaw Project 진행

JPMS 이점

  • 모듈 지정 및 모듈별 버전 관리 가능
  • 필요한 모듈만 구동하여 크기와 성능 최적화 가능
  • 임베디드와 같은 환경에서 필요한 모듈만 탑재하여 적은 메모리로 로딩 가능

Module

  • 패키지(package)의 상위 집합체
  • 고유한 이름으로 선언됨
  • 서로 관련있는 패키지, 리소스(image, XML..), module descriptor로 구성
  • 모듈간 의존성을 가질 수 있으며, 각 모듈은 캡슐화가 적용됨
  • java.base 모듈에 Java SE 플랫폼의 기본 API들이 정의되어 있음 (최상위 모듈)
  • java.base 모듈 구성요소
  • 모듈 사용 예제
    // module-info.java 파일
    module samplemodule {
     // requires : 의존하고 있는 모듈 명시
     requires othermodule;
     
     // exports : 다른 모듈의 코드에서 접근할 수 있는 public 패키지 지정
     exports packagename;
     // exprots to : 정확히 어떤 모듈이 접근 가능한지 명시
     exports packagename to module1, module2; 
     
     // uses : 해당 모듈에서 사용하는 서비스 지정
     uses classpath.interfacename; 
     // provides-with : 제공하는 서비스의 구현체 지정
     provides classpath.interfacename with implementation; 
     
     // opens : 런타임 시에만 접근할 수 있는 패키지 지정 (reflection 시)
     opens packagename;
     // opens-to : 패키지에 접근할 수 있는 특정 모듈 명시
     opens packagename to module1, module2;
     /* 만약 모듈의 모든 패키지들을 접근할 수 있도록 지정하고 싶으면 모듈 선언 시 open 예약어 사용
      * ex] open module modulename { ... } 
     */
    }


JShell Tool

  • 자바 프로그래밍 언어를 학습하고 자바 코드를 프로토타이핑하기 위한 대화식 도구 (컴파일/빌드 불필요)
  • 선언, 명령문 및 표현식 입력할 때 인식되고 결과를 즉시 표시하는 REPL(Read Evaluate Print Loop) 임
  • 사용방법


HTTP2 클라이언트 API 출시

  • 레거시인 HttpURLConnection을 대체
  • HTTP/1.1 및 HTTP/2 프로토콜 지원 추가
  • 동기(Blocking Mode), 비동기 모드 모두 지원
    HTTP2 사용 예제 - Medium


Process API 추가

  • 프로세스 검색을 위한 API
  • 모든 프로세스, 현재 프로세스, 하위 프로세스 및 종료된 프로세스 정보 확인 가능
  • 예제
    // current Process
    ProcessHandle processHandle = ProcessHandle.current();
    processHandle.getPid();
    processHandle.isAlive();
    processHandle.children().count();
    processHandle.supportsNormalTermination();
    ProcessHandle.InfoprocessInfo = processHandle.info();
    processInfo.arguments();
    processInfo.command();
    processInfo.totalCpuDuration();
    processInfo.user();
    // all Processes
    Stream<ProcessHandle> processStream = ProcessHandle.allProcesses();
    // destroy Process
    processHandle.destroy();
    Process (Java Platform SE 9 )


try-with-resource 개선

  • final 또는 사실상 final인 변수가 있을 경우, 새 변수를 선언하지 않고 try-with-resource 문에서 해당 변수를 사용할 수 있도록 개선
  • 예제
    before
    final Resource resource1 = new Resource("resource1");
    Resource resource2 = new Resource("resource2");
    
    try (Resource r1 = resource1;
         Resource r2 = resource2) {
       ...
    }
    after
    try(resource1; resource1) {
      ...
    }


Stream API 개선

  • Java9에서는 Stream API에 4개 메서드를 추가
    • iterate()
      IntStream.iterate(1, i -> i<20, i -> i*2).foreach(System.out::println);
    • dropWhile()
      Stream.of(1,2,3,4,5,6).dropWhile(i -> i<=3).foreach(System.out::print);
      //result: 456
      Stream.of(1,6,5,2,3,4).dropWhile(i -> i<=3).foreach(System.out::print);
      //result: 65234
    • takeWhile()
      Stream.of(1,2,3,4,5,6).takeWhile(i -> i<=3).foreach(System.out::print);
      //result: 123
      Stream.of(1,6,5,2,3,4).takeWhile(i -> i<=3).foreach(System.out::print);
      //result: 1
    • ofNullable()
      ```java
      // numbers [1,2,3,null]
      // mapNumber [1 - one, 2 - two, 3 - three, null - null]
      List<String> newstringNumbers = numbers.stream()
                  .flatMap(s -> Stream.ofNullable(mapNumber.get(s)))
                  .collect(Collectors.toList());
      //result: [one, two, three]
      ```


익명클래스 Diamond Operator 추가

  • Java7에서 추가된 다이아몬드 연산자를 익명클래스에서 사용 시 컴파일 오류가 발생
  • Java에서 해당 문제 수정
  • 예제
     FooClass<Integer> fc = new FooClass<>(1) { 
    	// anonymous inner class
      };
      FooClass<? extends Integer> fc0 = new FooClass<>(1) { 
      	// anonymous inner class
      };
      FooClass<?> fc1 = new FooClass<>(1) { 
      	// anonymous inner class
      };


불변 Collection 생성 메서드 추가

  • 기존에 구아바(guava)를 사용해서 생성하던 불변 List, Set, Map을 Map.Entry를 사용하여 생성하도록 지원
  • 예제
      List list = List.of("one", "two", "three");
      Map map = Map.of(1, "one", 2, "two", 3, "three");
      Set set = Set.of(1, 2, 3);


인터페이스 private 메서드 추가

  • Java8까지는 dafault, static 메서드 구현만 제공
  • Java9부터 중복 코드와 재사용 가능성을 피하기 위해 private 메서드 도입
  • 예제
    public interface Card {
    	private Long createCardId() { ... }
    	private static void displayCardDetails() { ... }
    }


기타 변경사항

  • Optional 클래스 개선
  • GC 개선
  • Multi-Resolution Image API 추가
  • Multi-release JARS
  • Java Platform Logging API and Service 추가
    등등

Oracle Java9 변경사항 보러가기
What's New in Oracle JDK 9



참고 자료

Java 9 Features with Examples - DigitalOcean
[Java] JPMS와 Module - Hello My World!

profile
엔지니어가 되는 그 날 까지!

0개의 댓글