Java 8/9/10/11 - LOG.INFO

이번 포스트는 Java의 버전마다 어떤 차이점이 있는지에 대해 알아본 내용을 정리해 보았습니다.

Java 8 (2014.03)

람다 표현식 (Lambda Expression)

  • 람다 표현식은 Java 코드를 좀 더 깔끔하고 쉽게 해주는 Java8의 새로운 피쳐이다
    static int doMathOperation(int a, int b, IMathOperation mathOperation) {
      return mathOperation.run(a, b);
    }
    
    doMathOperation(2, 1, (int a, int b) -> a + b)
    doMathOperation(2, 1, (int a, int b) -> a - b)
    doMathOperation(2, 1, (int a, int b) -> a * b)
    
Arg List Arrow Token Body   Note
(arg1, arg2…) -> { body }  
(Object o1, Object o2) -> o1.getCount() > o2.getCount() 타입 명시
(a, b) -> a + b 타입 명시 안해도 됨
(int a, int b) -> {return (a-b)} 값 반환
a -> a*a*a 매개변수가 하나면 괄호 필요 없음
() -> 42 매개변수가 없어도 됨
(String s) -> {System.out.print(s);} 반환 없이 그저 출력 함수 실행 가능

함수형 인터페이스 (Functional Interface)

  • 오직 하나의 추상 메서드만을 갖는 인터페이스

Method References

  • 메서드를 그것의 이름을 통해 표현하여 Single-method 람다 표현식을 대체

  • 문법은 다음과 같다
    Object/Class/Type::methodName
    
  • 일반 람다 표현식의 예
    vetRepository.findAll().forEach(o->vets.add(o));
    
  • Method references를 사용한 예
    vetRepository.findAll().forEach(vets::add);
    

Stream API

  • 일련의 객체들이 생성되는 것을 표현한 추상적 개념
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
// get List from Stream Operation
List<String> result = numbers.stream()
.filter(i -> (i % 2) == 0)
.map(i -> "[" + i + "]")
.collect(Collectors.toList());

System.out.println(result);

New Date/Time API

  • 이 새로운 Date/Time API를 사용하여 개발자는 더 자연스럽고, 간결하고, 이해하기 쉬운 방식으로 날짜 및 시간을 처리할 수 있음.
  • LocalDate
// 2016-12-18
LocalDate currentDate = LocalDate.now();
// 2016-12-19
LocalDate specDay = LocalDate.of(2016, Month.DECEMBER, 19);
// 2016-12-20
LocalDate parseDay = LocalDate.parse("2016-12-20");
// 2016-12-30
LocalDate day365 = LocalDate.ofYearDay(2016, 365);
int dayOfYear = currentDate.getDayOfYear();
// 366
int lengthOfYear = currentDate.lengthOfYear();
// true
boolean isLeapYear = currentDate.isLeapYear();
// SUNDAY
DayOfWeek dayOfWeek = currentDate.getDayOfWeek();
  • LocalTime
// 16:49:18.175 for example
LocalTime currentTime = LocalTime.now();
// it depends on currentTime >> 16:49:18.175 -> 60558
int secondOfDay = currentTime.toSecondOfDay();
// 12:34
LocalTime specHM = LocalTime.of(12, 34);
// 12:34:56
LocalTime specHMS = LocalTime.of(12, 34, 56);
// 01:23:45
LocalTime parseHMS = LocalTime.parse("01:23:45");
// 12345th second of a day is [03:25:45]
LocalTime secondsOfDay = LocalTime.ofSecondOfDay(12345);
  • LocalDateTime
// 2016-12-18T16:53:22.584
LocalDateTime currentDateTime = LocalDateTime.now();
// 2016
int year = currentDateTime.getYear();
// DECEMBER
Month month = currentDateTime.getMonth();
// OCTOBER
Month firstMonthOfQuarter = month.firstMonthOfQuarter();
// 18
int day = currentDateTime.getDayOfMonth();
// 16
int hour = currentDateTime.getHour();
// 53
int minute = currentDateTime.getMinute();
// 22
int seconds = currentDateTime.getSecond();
// 2016-12-24T12:34
LocalDateTime XMas = LocalDateTime.of(2016, Month.DECEMBER, 24, 12, 34);
  • Plus and Minus Date & Time
  • TemporalAdjusters
  • Period & Duration
  • TimeZone
  • Formatting and Parsing

CompletableFuture API - Multithreading

Nashhorn JavaScript 엔진

  • 새로운 경량의 고성능 JavaScript 엔진이 구현되어 JDK에 통합되었으며 기존 API를 통해 Java 응용 프로그램에서 이 엔진을 사용할 수 있음.

향상된 보안

  • 호출자에 의존하는 메소드를 수동으로 유지 관리하는 기존 목록을 이러한 메소드를 정확하게 식별하고 호출자를 안정적으로 검색하는 방식으로 바꿈.

Java 9 (2017.09)

Diamond Operation에 익명 클래스 사용 가능

MyHandler<? extends Integer> intHandler1 = new MyHandler<>(10){
    @Override
    void handle(){
        // handling code...
    }
};
MyHandler<?> handler = new MyHandler<>("One hundred"){
    @Override
    void handle(){
        // handling code...
    }
};

Process API

  • Process 검색을 위한 새로운 방법
    // current Process
    ProcessHandle processHandle = ProcessHandle.current();
    // all Processes
    Stream<ProcessHandle> processStream = ProcessHandle.allProcesses();
    // destroy Process
    processHandle.destroy();
    

Platform Logging API and Service

Flow API - Reactive streams

Factory Methods for Collections and Map

Java 10 (2018.03)

지역 변수 타입 추론 (Local variable type inferenece)

enhances the Java language to extend type inference to declarations of local variables with initializers.

G1 가비지 콜렉터를 위한 Parallel Full GC

Improves G1 worst-case latencies by making the full GC parallel. The G1 garbage collector is designed to avoid full collections, but when the concurrent collections can’t reclaim memory fast enough a fall back full GC will occur. The old implementation of the full GC for G1 used a single threaded mark-sweep-compact algorithm. With JEP 307 the full GC has been parallelized and now use the same amount of parallel worker threads as the young and mixed collections.

APIs for Creating Unmodifiable Collections

Several new APIs have been added that facilitate the creation of unmodifiable collections. The List.copyOf, Set.copyOf, and Map.copyOf methods create new collection instances from existing instances. New methods toUnmodifiableList(), toUnmodifiableSet(), and toUnmodifiableMap() have been added to the Collectors class in the Stream package. These allow the elements of a Stream to be collected into an unmodifiable collection.

Application Class-Data Sharing

optimizes startup time and footprint by extending the existing Class-Data Sharing (“CDS”) feature to allow application classes to be placed in the shared archive.

Java기반 JIT Compiler 시범 도입

enables the Java-based JIT compiler, Graal, to be used as an experimental JIT compiler on the Linux/x64 platform

Optional.orElseThrow() Method

A new method orElseThrow has been added to the Optional class. It is synonymous with and is now the preferred alternative to the existing get method.

Java 11 (2018.09)

향상된 콘솔 관리

Provides system administrators an effective control over diverse Java versions running on desktops in the enterprise enabling a more secure environment and enhanced application experience and availability.

향상된 보안

A description of security information provided by role. For developers, system administrators, home users, and security professionals.

Java Mission Control

Java Flight Recorder and Java Mission Control together create a complete tool chain to continuously collect low level and detailed runtime information enabling after-the-fact incident analysis.

Deployment Rule Set

Deployment rule set allows a desktop administrator to control the level of Java client compatibility and default prompts across an organization

정리

분류 Java 8 Java 9 Java 10 Java 11
출시 2014.03 2017.09 2018.03 2018.09
내용 - Lambda Expression
- 함수형 인터페이스
- Method References
- Stream API
- New Date/Time API
- CompletableFuture API
- Nashhorn JavaScript 엔진
- 향상된 보안
- 익명 클래스 in <? >
- Process API
- Platform Logging API and Service
- Flow API(Reactive streams)
- Collections을 위한 Factory Methods
- 지역 변수 타입 추론
- G1 가비지 콜렉터를 위한 Parallel Full GC
- APIs for Creating Unmodifiable Collections
- Application Class-Data Sharing
- Java기반 JIT Compiler 시범 도입
- Optional.orElseThrow() Method
- 향상된 콘솔 관리
- 향상된 보안
- Java Mission Control
- Deployment Rule Set

꼬리에 꼬리를 물어~~~

  • Java 8이 출시된 이후 3년 반만에 Java 9가 출시되었고, 그 이후로는 오라클이 클라우드 주도 개발자(cloud-driven developer)들을 지원하기 위해 앞으로 자바의 릴리즈 주기를 6개월로 변경
  • JIT Compiler (Just-In-Time Compiler)

참고 문헌

  • https://www.java.com/ko/download/faq/java8.xml
  • https://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html
  • https://grokonez.com/java-tutorial/java-8
  • http://itstory.tk/entry/Java-10-신규-기능특징-정리
  • http://jusungpark.tistory.com/58