1. 개요
Java 14는 2020 년 3 월 17 일에 릴리스되었으며, Java의 새 릴리스주기에 따라 이전 버전 보다 정확히 6 개월 뒤 입니다.
이 사용방법(예제)에서는 언어 버전 14의 새로운 기능과 더 이상 사용되지 않는 기능에 대한 요약을 살펴 봅니다 .
또한 새로운 기능에 대한 심층적 인보기를 제공하는 Java 14에 대한 자세한 기사 가 있습니다.
2. 이전 버전에서 이어온 기능
이전 버전의 Java 14에서는 몇 가지 기능이 이전되었습니다. 하나씩 살펴 보겠습니다.
2.1. 스위치 표현식 ( JEP 361 )
이 기능은 JDK 12의 미리보기 기능으로 처음 도입되었으며 Java 13에서도 미리보기 기능으로 만 계속되었습니다. 그러나 이제 스위치 표현식 이 표준화되어 개발 키트의 일부이자 소포입니다 .
이것이 효과적으로 의미하는 것은이 기능이 이제 개발자가 실험 할 미리보기 모드가 아닌 프로덕션 코드에서 사용할 수 있다는 것입니다.
간단한 예로 요일을 평일 또는 주말로 지정하는 시나리오를 고려해 보겠습니다.
이 개선 사항 이전에는 다음과 같이 작성했습니다.
boolean isTodayHoliday;
switch (day) {
case "MONDAY":
case "TUESDAY":
case "WEDNESDAY":
case "THURSDAY":
case "FRIDAY":
isTodayHoliday = false;
break;
case "SATURDAY":
case "SUNDAY":
isTodayHoliday = true;
break;
default:
throw new IllegalArgumentException("What's a " + day);
}
스위치 표현식을 사용하면 동일한 내용을 더 간결하게 작성할 수 있습니다.
boolean isTodayHoliday = switch (day) {
case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> false;
case "SATURDAY", "SUNDAY" -> true;
default -> throw new IllegalArgumentException("What's a " + day);
};
2.2. 텍스트 블록 ( JEP 368 )
텍스트 블록 은 주류 업그레이드를위한 여정을 계속하며 미리보기 기능으로 계속 사용할 수 있습니다.
JDK 13의 기능 외에도 여러 줄 문자열을 사용하기 쉽게 만드는 두 번째 미리보기에서 텍스트 블록에는 이제 두 개의 새로운 이스케이프 시퀀스가 있습니다 .
- \ : 줄의 끝을 나타 내기 위해 새 줄 문자가 도입되지 않습니다.
- \ s : 단일 공백 표시
예를 들면 :
String multiline = "A quick brown fox jumps over a lazy dog; the lazy dog howls loudly.";
이제 다음과 같이 작성할 수 있습니다.
String multiline = """
A quick brown fox jumps over a lazy dog; \
the lazy dog howls loudly.""";
이것은 인간의 눈에 대한 문장의 가독성을 향상 시키지만 개 뒤에 줄 바꿈을 추가하지는 않습니다 . .
3. 새로운 미리보기 기능
3.1. instanceof에 대한 패턴 매칭 ( JEP 305 )
JDK 14는 상용구 코드를 제거하고 개발자의 삶을 조금 더 쉽게 만들기 위해 예 를 들어 패턴 매칭을 도입했습니다 .
이를 이해하기 위해 간단한 예를 살펴 보겠습니다.
이 기능 이전에 다음과 같이 작성했습니다.
if (obj instanceof String) {
String str = (String) obj;
int len = str.length();
// ...
}
이제 obj 를 String으로 사용하기 위해 많은 코드가 필요하지 않습니다 .
if (obj instanceof String str) {
int len = str.length();
// ...
}
향후 릴리스에서 Java는 switch 와 같은 다른 구성에 대한 패턴 일치를 제공 할 것 입니다.
3.2. 기록 ( JEP 359 )
데이터 모델 POJO에서 반복적 인 상용구 코드를 줄이기 위해 레코드 가 도입되었습니다. 일상적인 개발을 단순화하고 효율성을 개선하며 인적 오류의 위험을 크게 최소화합니다 .
예를 들어,에 대한 데이터 모델 사용자 와 ID 및 암호를 간단하게 정의 할 수 있습니다 :
public record User(int id, String password) { };
보시다시피 여기에 새 키워드 인 record를 사용하고 있습니다 . 이 간단한 선언은 자동으로 생성자, getters, equals , hashCode 및 toString 메소드를 추가합니다.
JUnit을 사용하여이 작업을 살펴 보겠습니다.
private User user1 = new User(0, "UserOne");
@Test
public void givenRecord_whenObjInitialized_thenValuesCanBeFetchedWithGetters() {
assertEquals(0, user1.id());
assertEquals("UserOne", user1.password());
}
@Test
public void whenRecord_thenEqualsImplemented() {
User user2 = user1;
assertTrue(user1, user2);
}
@Test
public void whenRecord_thenToStringImplemented() {
assertTrue(user1.toString().contains("UserOne"));
}
4. 새로운 생산 기능
두 가지 새로운 미리보기 기능과 함께 Java 14는 구체적인 프로덕션 준비 기능도 제공했습니다.
4.1. 유용한 NullPointerExceptions ( JEP 358 )
이전에 NullPointerException에 대한 스택 추적 에는 주어진 파일의 주어진 줄에서 일부 값이 null이라는 점을 제외하고는 말할 내용이 많지 않았습니다.
이 정보는 유용하지만 개발자가 로그를보고 이해할 수 있도록 전체 그림을 그리는 대신 디버그 할 줄만 제안했습니다.
이제 Java는 주어진 코드 줄에서 정확히 null이 무엇인지 지적하는 기능을 추가하여 이를 쉽게 만들었습니다 .
예를 들어 다음과 같은 간단한 스 니펫을 고려하십시오.
int[] arr = null;
arr[0] = 1;
이전에는이 코드를 실행할 때 로그에 다음과 같이 표시됩니다.
Exception in thread "main" java.lang.NullPointerException
at com.baeldung.MyClass.main(MyClass.java:27)
그러나 이제 동일한 시나리오가 주어지면 로그에 다음과 같이 표시 될 수 있습니다.
java.lang.NullPointerException: Cannot store to int array because "a" is null
보시다시피 이제 어떤 변수가 예외를 일으켰는지 정확히 알 수 있습니다.
5. 배양 기능
이들은 Java 팀이 제안하고 실험을 위해 제공하는 최종 API 및 도구입니다. 미리보기 기능과 다르며 jdk.incubator 패키지에 별도의 모듈로 제공됩니다 .
5.1. 외부 메모리 액세스 API ( JEP 370 )
이것은 Java 프로그램이 안전하고 효율적인 방식으로 힙 외부의 원시 메모리와 같은 외부 메모리에 액세스 할 수 있도록 하는 새로운 API 입니다.
mapDB 및 memcached 와 같은 많은 Java 라이브러리 는 외부 메모리에 액세스하며 Java API 자체가 더 깨끗한 솔루션을 제공 할 때였 습니다. 이러한 의도로 팀은 힙이 아닌 메모리에 액세스하는 기존 방법 인 ByteBuffer API 및 sun.misc.Unsafe API에 대한 대안으로이 JEP를 고안했습니다 .
MemorySegment , MemoryAddress 및 MemoryLayout 의 세 가지 주요 추상화를 기반으로 구축 된 이 API는 힙 및 비힙 메모리에 모두 액세스하는 안전한 방법입니다.
5.2. 패키징 도구 ( JEP 343 )
전통적으로 Java 코드를 전달하기 위해 응용 프로그램 개발자는 사용자가 자신의 JVM 내에서 실행해야하는 JAR 파일을 간단히 보냅니다.
그러나 사용자 는 Windows 또는 macOS와 같은 기본 플랫폼에 패키지를 설치하기 위해 두 번 클릭하는 설치 프로그램을 기대했습니다 .
이 JEP는이를 정확하게 수행하는 것을 목표로합니다. 개발자는 jlink 를 사용 하여 JDK를 최소 필수 모듈로 압축 한 다음이 패키징 도구를 사용하여 Windows 에서 exe 로 설치 하거나 macOS 에서 dmg 로 설치할 수있는 경량 이미지를 만들 수 있습니다 .
6. JVM / 핫스팟 기능
6.1. Windows ( JEP 365 ) 및 macOS ( JEP 364 )의 ZGC – 실험용
Z 가비지 수집기 , 확장 성, 낮은 레이턴시 가비지 수집기가 제 기능을 실험적으로 자바 (11)에 도입 하였다. 하지만 처음에 지원되는 플랫폼은 Linux / x64뿐이었습니다.
Linux 용 ZGC에 대한 긍정적 인 피드백을받은 후 Java 14는 Windows 및 macOS에서도 지원을 포팅했습니다 . 아직 실험적인 기능이지만 다음 JDK 릴리스 에서 프로덕션 준비가 완료 되었습니다 .
6.2. G1에 대한 NUMA 인식 메모리 할당 ( JEP 345 )
병렬 수집기와 달리 G1 가비지 수집기에 대해 NUMA (Non-uniform Memory Access)가 지금까지 구현되지 않았습니다.
여러 소켓에서 단일 JVM을 실행하기 위해 제공하는 성능 향상을 살펴보면 이 JEP는 G1 콜렉터가 NUMA를 인식하도록하기 위해 도입되었습니다 .
이 시점에서 다른 HotSpot 수집기에 동일한 항목을 복제 할 계획이 없습니다.
6.3. JFR 이벤트 스트리밍 ( JEP 349 )
이 향상된 기능으로 JDK의 비행 레코더 데이터가 노출되어 지속적으로 모니터링 할 수 있습니다. 여기에는 jdk.jfr.consumer 패키지에 대한 수정이 포함 되어 사용자가 이제 레코딩 데이터를 직접 읽거나 스트리밍 할 수 있습니다.
7. 더 이상 사용되지 않거나 제거 된 기능
Java 14는 다음 두 가지 기능을 더 이상 사용하지 않습니다.
- Solaris 및 SPARC 포트 ( JEP 362 ) –이 Unix 운영 체제 및 RISC 프로세서는 지난 몇 년 동안 활발하게 개발되지 않았기 때문입니다.
- ParallelScavenge + SerialOld GC 조합 ( JEP 366 ) – 거의 사용되지 않는 GC 알고리즘 조합이며 상당한 유지 관리 노력이 필요하기 때문입니다.
또한 몇 가지 제거가 있습니다.
- CMS (Concurrent Mark Sweep) 가비지 수집기 ( JEP 363 ) – Java 9에서 더 이상 사용되지 않으며이 GC는 기본 GC로 G1에 의해 성공했습니다. 또한 ZGC 및 Shenandoah와 같이 현재 사용할 수있는 다른 성능 대안이 있으므로 제거
- Pack200 도구 및 API ( JEP 367 ) – Java 11에서 제거하기 위해 더 이상 사용되지 않으며 이제 제거되었습니다.
8. 결론
이 예제에서는 Java 14의 다양한 JEP를 살펴 보았습니다.
모두에서는, 언어의이 릴리스 (16 개) 주요 기능이 있습니다 미리보기 기능, 인큐베이터, 중단 된 및 제거 포함하여. 우리는 그것들을 하나씩 살펴 보았고 예제와 함께 언어 기능을 살펴 보았습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/java-14-new-features
'Java' 카테고리의 다른 글
자바 컬렉션 (0) | 2021.03.21 |
---|---|
Java 8의 새로운 기능 (0) | 2021.03.21 |
Spring을 사용한 기능 플래그 (0) | 2021.03.20 |
PowerMock 소개 (0) | 2021.03.20 |
Big O 표기법의 실용적인 Java 예제 (0) | 2021.03.20 |