Java 11 기능

우리는 아직 Java 10에 완전히 몰두하지 않았으며, Java 11이 여기 있습니다. Java 11은 몇 가지 이유로 중요합니다. 오라클은 지원 모델을 개선하고 약 6개월마다 빠른 업데이트를 제공하는 릴리스 트레인을 도입했습니다. 그들은 라이선스 및 지원 모델을 변경했기 때문에 Java 11 Oracle JDK를 다운로드하면 상업적으로 사용할 경우 유료가 될 것입니다.

그것은 이제부터 Java를 위해 돈을 내야 한다는 의미입니까? 아니요. 다운로드하고 프로덕션에서 사용하지 않는 한 Oracle JDK에 대해 지불할 필요는 없습니다.

참고: IntelliJ IDEA 2018.2.4 Community Edition은 이미 Java 11을 지원합니다.

1. Java 11이 중요한 이유는 무엇입니까?

Java 11은 Java 8 이후의 두 번째 LTS 릴리스입니다. Java 11부터 오라클 JDK는 상업적인 용도로 더 이상 무료가 아닙니다. 개발 단계에서는 사용할 수 있지만 상업적으로 사용하려면 라이선스를 구매해야 합니다. 그렇지 않으면 언제든지 Oracle에서 청구서를 받을 수 있습니다! Java 10은 다운로드할 수 있는 마지막 무료 Oracle JDK였습니다. Oracle은 2019년 1월부터 Java 8 지원을 중단했습니다. 더 많은 지원을 위해 지불해야 할 것입니다. 계속 사용할 수는 있지만 패치/보안 업데이트를 받을 수는 없습니다.

Oracle은 Java 11 이후의 어떤 단일 Java 버전에 대해서도 무료 장기 지원 (LTS)을 제공하지 않을 것입니다.

오라클 JDK가 더 이상 무료가 아니더라도, 언제든지 오라클이나 AdoptOpenJDK, Azul, IBM, Red Hat 등 기타 제공업체로부터 Open JDK 빌드를 다운로드할 수 있습니다. 내 의견으로는, 엔터프라이즈 수준의 사용을 찾고 지원 수수료를 지불할 의사가 없다면 필요할 때마다 업그레이드할 수 있도록 OpenJDK를 사용할 수 있습니다.

2. 어떤 JDK 빌드를 다운로드해야 하며 각각의 장점은 무엇인가요?

오라클은 6개월마다 새로운 버전이 출시되는 릴리스 트레인을 만들었습니다. 무료로 오라클의 Open JDK를 사용하는 경우, 새 버전이 출시되면 6개월마다 업데이트해야 합니다. 새 버전이 출시되면 오라클은 무료 업데이트를 제공하지 않습니다. 이는 회사에 적응하기 어려울 수 있습니다. 오라클에 상업용 지원을 구입하고 LTS 버전에서 다음 LTS 버전으로만 마이그레이션하십시오. 이렇게 하면 2026년까지 Java 11에 대한 모든 업데이트와 지원을 받을 수 있습니다. 2022년에 Java 17을 다운로드할 수 있습니다. 지원이 종료된 후에도 무료 Java 버전을 유지하십시오. 하지만 보안 업데이트를 받을 수 없으며 보안 취약점이 생길 수 있습니다.

오라클은 Java 9와 Java 10에 대해 상업용 지원이나 업데이트를 제공하지 않습니다. 무료로 계속 사용하려면 다른 대안 빌드를 찾아야 합니다.

자바 11이 가져오는 부담을 이해한 후, 이제 개발자를 위한 자바 11의 중요한 기능을 분석해 보겠습니다. 몇 가지 중요한 JEPs도 논의할 것입니다. 참고: JavaFX는 별도의 모듈로 제공되며 Java JDK의 6개월 릴리스 주기에 묶이지 않습니다.

3. 자바 11 무료 버전 다운로드 방법?

링크에서 제품용 OpenJDK 버전을 다운로드할 수 있습니다. 바이너리는 tar 또는 zip 형식으로 제공되므로 그냥 압축을 풀고 환경 변수를 설정하여 자바 컴파일러 및 자바 명령을 사용할 수 있습니다.

4. 자바 11 기능

중요한 자바 11 기능 중 일부는 다음과 같습니다:

  • 단일 명령으로 자바 파일 실행
  • String 클래스에 새로운 유틸리티 메서드
  • 람다 매개변수를 위한 지역 변수 구문
  • 중첩 기반 액세스 제어
  • JEP 321: HTTP 클라이언트
  • 파일로부터 문자열 읽기/쓰기
  • JEP 328: 플라이트 레코더

자바 11에서 JEP 프로세스를 통해 도입된 새로운 기능을 논의해 보겠습니다.

4.1) 단일 명령으로 Java 파일 실행하기

주요 변경 사항 중 하나는 먼저 javac 도구로 Java 소스 파일을 컴파일할 필요가 없다는 것입니다. java 명령어로 파일을 직접 실행할 수 있으며 암시적으로 컴파일됩니다. 이 기능은 JEP 330에 해당합니다. Java 11에서 도입된 Java String 클래스의 새로운 메서드를 살펴보겠습니다:

4.2) Java String 메서드

isBlank() – 이 인스턴스 메서드는 부울 값으로 반환됩니다. 빈 문자열과 공백만 있는 문자열은 공백으로 간주됩니다.

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // 여기에 코드를 입력하세요!
        
        System.out.println(" ".isBlank()); //true
        
        String s = "Anupam";
        System.out.println(s.isBlank()); //false
        String s1 = "";
        System.out.println(s1.isBlank()); //true
    }
}

lines() – 이 메서드는 줄별로 분할된 모든 부분 문자열의 컬렉션인 문자열 스트림을 반환합니다.

import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws Exception {
        
        String str = "JD\nJD\nJD"; 
        System.out.println(str);
        System.out.println(str.lines().collect(Collectors.toList()));
    }
}

위 코드의 출력은: strip(), stripLeading(), stripTrailing() strip() – 문자열의 시작과 끝에서 공백을 제거합니다.

하지만 이미 trim()이 있습니다. 그럼 strip()이 필요한 이유는 무엇입니까? strip()trim()의 “유니코드 인식”된 진화체입니다. trim()이 소개될 당시에는 유니코드가 발전하지 않았습니다. 이제 새로운 strip()은 모든 종류의 앞뒤 공백을 제거합니다(유니코드가 공백인지 여부를 확인하려면 메소드 Character.isWhitespace(c)를 확인하세요)

위의 세 가지 방법을 사용한 예제는 아래에 제공됩니다:

public class Main {
    public static void main(String[] args) throws Exception {
        // 여기에 코드를 입력하세요!
        
        String str = " JD "; 
        System.out.print("Start");
        System.out.print(str.strip());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripLeading());
        System.out.println("End");
        
        System.out.print("Start");
        System.out.print(str.stripTrailing());
        System.out.println("End");
    }
}

위의 코드로부터 콘솔에 출력되는 결과는 다음과 같습니다: repeat(int) repeat 메소드는 int 형태로 메소드에 명시된 횟수만큼 문자열을 반복합니다.

public class Main {
    public static void main(String[] args) throws Exception {
        // 여기에 코드를 입력하세요!
        
        String str = "=".repeat(2);
        System.out.println(str); //prints ==
    }
}

4.3) 람다 매개변수에 대한 지역 변수 구문

JEP 323, 로컬 변수 구문(Lambda 매개변수용)은 Java 11에서 발표된 유일한 언어 기능입니다. Java 10에서는 로컬 변수 타입 추론이 소개되었습니다. 따라서 우리는 변수의 타입을 우측항에서 추론할 수 있었습니다 – var list = new ArrayList<String>(); JEP 323은 암시적으로 유형이 지정된 람다 표현식의 형식 매개변수를 선언하는 데 var를 사용할 수 있게 합니다. 이제 다음을 정의할 수 있습니다 :

(var s1, var s2) -> s1 + s2

이것은 Java 8에서도 가능했지만 Java 10에서 제거되었습니다. 이제 Java 11에서 다시 돌아와 일관성 유지가 필요합니다. 그렇다면 람다에서 타입을 건너뛸 수 있는데 왜 필요한 걸까요? 만약 @Nullable과 같은 주석을 적용해야 한다면 타입을 정의하지 않고는 할 수 없습니다. 이 기능의 제한 – 모든 매개변수에 대해 var 유형을 지정하거나 그렇지 않으면 안 됩니다. 다음과 같은 것들은 불가능합니다:

(var s1, s2) -> s1 + s2 //no skipping allowed
(var s1, String y) -> s1 + y //no mixing allowed

var s1 -> s1 //not allowed. Need parentheses if you use var in lambda.

4.4) 중첩 기반 액세스 제어

Java 11 이전에는 다음과 같이 가능했습니다:

public class Main {
 
    public void myPublic() {
    }
 
    private void myPrivate() {
    }
 
    class Nested {
 
        public void nestedPublic() {
            myPrivate();
        }
    }
}

주요 클래스의 private 메서드는 위의 중첩 클래스에서 위와 같은 방식으로 접근할 수 있습니다. 그러나 Java Reflection을 사용하면 IllegalStateException이 발생합니다.

Method method = ob.getClass().getDeclaredMethod("myPrivate");
method.invoke(ob);

Java 11 중첩 액세스 제어는 리플렉션에서 이 문제를 다룹니다. java.lang.Class는 리플렉션 API에서 세 가지 메서드를 소개합니다: getNestHost(), getNestMembers(), 그리고 isNestmateOf().

4.5) JEP 309: 동적 클래스 파일 상수

Java 클래스 파일 형식은 이제 새로운 상수 풀 형식, CONSTANT_Dynamic을 지원합니다. 이 JEP의 목표는 사용자가 제공한 동작과 매개변수화될 수 있는 단일 새로운 상수 풀 형식을 생성함으로써 새로운 클래스 파일 제약 형식을 개발하는 비용과 중단을 줄이는 것입니다. 이는 성능을 향상시킵니다

4.6) JEP 318: 엡실론: No-Op 가비지 컬렉터

JVM GC가 메모리를 할당하고 해제하는 데 책임이 있는 반면, 엡실론은 메모리를 할당하기만 합니다. 엡실론은 다음을 위해 메모리를 할당합니다:

  • 성능 테스트.
  • 메모리 압력 테스트.
  • VM 인터페이스 테스트.
  • 매우 짧은 수명의 작업.
  • 마지막으로 대기 시간을 개선합니다.
  • 마지막으로 처리량을 개선합니다.

이제 Elipson은 테스트 환경에만 적합합니다. 프로덕션에서는 OutOfMemoryError를 유발하고 응용 프로그램을 중단시킬 것입니다. Elipson의 장점은 메모리 정리 오버헤드가 없다는 것입니다. 따라서 성능의 정확한 테스트 결과를 제공하며 더 이상 GC를 중지할 수 없습니다. 참고: 이것은 실험적인 기능입니다.

4.7) JEP 320: Java EE 및 CORBA 모듈 제거

이 모듈들은 이미 Java 9에서 사용이 중지되었습니다. 이제 완전히 제거되었습니다. 다음 패키지가 제거되었습니다: java.xml.ws, java.xml.bind, java.activation, java.xml.ws.annotation, java.corba, java.transaction, java.se.ee, jdk.xml.ws, jdk.xml.bind

4.8) JEP 328: Flight Recorder

이전에 오라클 JDK에서 상용 애드온으로 사용되던 비행 레코더는 이제 오라클 JDK 자체가 무료가 아니기 때문에 오픈 소스로 공개되었습니다. JFR은 실행 중인 Java 애플리케이션에서 진단 및 프로파일링 데이터를 수집하는 프로파일링 도구입니다. 그 성능 오버헤드는 무시할 정도로 작아서 보통 1% 미만입니다. 따라서 이를 제품 애플리케이션에서 사용할 수 있습니다.

4.9) JEP 321: HTTP Client

Java 11은 Http Client API를 표준화합니다. 새 API는 HTTP/1.1과 HTTP/2를 모두 지원합니다. 클라이언트가 요청을 보내고 서버로부터 응답을 받는 전체적인 성능을 개선하기 위해 설계되었습니다. 또한 웹소켓을 네이티브로 지원합니다.

4.10) 파일에서 문자열 읽기/쓰기

Java 11은 문자열의 읽기와 쓰기를 편리하게 만들기 위해 노력합니다. 파일에서 읽고 쓰기를 위해 다음 메서드를 도입했습니다:

  • readString()
  • writeString()

다음 코드는 이를 예시로 보여줍니다.

Path path = Files.writeString(Files.createTempFile("test", ".txt"), "This was posted on JD");
System.out.println(path);
String s = Files.readString(path);
System.out.println(s); //This was posted on JD

4.11) JEP 329: ChaCha20 및 Poly1305 암호 알고리즘

Java 11은 ChaCha20 및 ChaCha20-Poly1305 암호 구현을 제공합니다. 이러한 알고리즘은 SunJCE 제공자에서 구현됩니다.

4.12) JEP 315: Aarch64 Intrinsics 개선

Aarch64 프로세서에서 기존 문자열 및 배열 인트린직스를 개선하고, java.lang.Math sin, cos 및 log 함수를 위한 새로운 인트린직스를 구현합니다.

4.13) JEP 333: ZGC: 확장 가능한 저지연 가비지 수집기 (실험적)

Java 11에서는 저지연 GC가 도입되었습니다. 이것은 실험적인 기능입니다. Oracle이 GC에 중요성을 부여하고 있는 것을 볼 수 있어 좋습니다.

4.14) JEP 335: Nashorn JavaScript 엔진 지원 중단

Nashorn JavaScript 스크립트 엔진과 API가 지원 중단되었으며, 이는 이후 릴리스에서 제거될 것을 의미합니다.

5. 결론

우리는 Java 11에서 제공되는 중요한 기능 및 업데이트를 살펴보았습니다. Java 12가 출시되면 다시 만나요.

Source:
https://www.digitalocean.com/community/tutorials/java-11-features