마침내 여기에는 6개월 주기의 일부인 JDK 12가 있습니다. 이는 마지막 Java LTS 버전 11 이후에 나왔습니다. 이전에는 Java 11 기능에 대해 자세히 논의했습니다. 오늘은 Java 12 기능을 논의하고 개발자들에게 어떤 기능을 제공하는지 살펴보겠습니다. Java 12는 2019년 3월 19일에 출시되었습니다. 이는 비-LTS 버전이므로 장기 지원을 받을 수 없습니다.
Java 12 기능
중요한 Java 12 기능 중 일부는 다음과 같습니다;
- JVM 변경 사항 – JEP 189, JEP 346, JEP 344 및 JEP 230.
- Switch 표현식
- File mismatch() 메소드
- Compact Number Formatting
- 스트림 API의 Teening Collectors
- Java 문자열의 새로운 메소드 – indent(), transform(), describeConstable() 및 resolveConstantDesc().
- JEP 334: JVM 상수 API
- JEP 305: instanceof를 위한 패턴 매칭
- JDK 12에서 Raw String Literals가 제거되었습니다.
이제 Java 12 기능을 하나씩 살펴보겠습니다.
JVM 변경 사항
1. JEP 189 – Shenandoah: 저-일시-시간 가비지 컬렉터 (실험적)
레드햇은 Shenandoah 가비지 컬렉터를 시작하여 GC 일시 중지 시간을 줄이려고합니다. 이 아이디어는 실행 중인 Java 스레드와 동시에 GC를 실행하는 것입니다. 이것은 힙 크기와 관계없이 일관되고 예측 가능한 짧은 일시 중지를 목표로합니다. 따라서 힙 크기가 15 MB이든 15GB이든 상관없습니다. 이것은 Java 12의 실험적인 기능입니다.
2. JEP 346 – G1에서 사용되지 않는 메모리 즉시 반환
Java 12를 설명하면 G1은 이제 응용 프로그램 비활성 상태에서 Java 힙 메모리를 확인하고 운영 체제로 반환합니다. 이것은 미리 예방적인 조치로 무료 메모리를 보존하고 사용하는 것입니다.
3. JEP 344: G1을위한 중단 가능한 혼합 컬렉션
G1 효율성 개선에는 정의된 일시 중지 목표를 초과할 수 있는 경우 G1 혼합 컬렉션을 중단할 수 있는 기능이 포함됩니다. 이를 위해 혼합 컬렉션 세트를 필수 및 선택적으로 분할하여 G1 콜렉터가 일시 중지 시간 목표를 충족하기 위해 우선적으로 필수 세트를 수집할 수 있습니다.
4. JEP 230 및 344
마이크로벤치마크 스위트, JEP 230 기능은 JDK 소스 코드에 기본 마이크로벤치마크 스위트를 추가합니다. 이를 통해 개발자들은 기존의 마이크로벤치마크를 실행하고 새로운 마이크로벤치마크를 생성할 수 있습니다. AArch64 포트 한 개, 두 개가 아닌 JEP 344는 32비트 ARM 포트와 64비트 aarch64 포트는 유지하면서 arm64 포트와 관련된 모든 소스를 제거합니다. 이를 통해 기여자들은 단일 64비트 ARM 구현에 노력을 집중할 수 있습니다.
5. JEP 341 Default CDS Archives
이 기능은 64비트 플랫폼에서 기본 클래스 목록을 사용하여 클래스 데이터 공유(CDS) 아카이브를 생성하도록 JDK 빌드 프로세스를 개선합니다. 목표는 시작 시간을 개선하는 것입니다. Java 12부터 CDS는 기본적으로 켜져 있습니다. CDS를 끈 채로 프로그램을 실행하려면 다음을 수행하십시오:
java -Xshare:off HelloWorld.java
이로 인해 프로그램의 시작 시간이 지연될 수 있습니다.
언어 변경 및 기능
Java 12는 많은 언어 기능을 도입했습니다. 구현과 함께 몇 가지를 살펴보겠습니다.
1. Switch 표현식 (미리보기)
Java 12는 패턴 매칭을 위해 Switch 표현식을 향상시켰습니다. JEP 325에서 도입된이 미리보기 언어 기능의 새로운 구문은 L ->
입니다. Switch 표현식에 대해 알아야 할 몇 가지 사항은 다음과 같습니다:
- 새로운 구문은 fallthrough를 방지하기 위해 break 문이 필요하지 않습니다.
- Switch 표현식은 더 이상 fallthrough하지 않습니다.
- 또한, 동일한 라벨에서 여러 상수를 정의할 수 있습니다.
default
케이스는 이제 Switch 표현식에서 필수입니다.break
는 Switch 표현식에서 케이스 자체에서 값을 반환하는 데 사용됩니다.
기존의 switch 문:
String result = "";
switch (day) {
case "M":
case "W":
case "F": {
result = "MWF";
break;
}
case "T":
case "TH":
case "S": {
result = "TTS";
break;
}
};
System.out.println("Old Switch Result:");
System.out.println(result);
새로운 Switch 표현식을 사용하면 break를 모든 곳에 설정할 필요가 없어지므로 논리 오류를 방지할 수 있습니다!
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
System.out.println(result);
JDK 12를 사용하여 새로운 Switch 표현식을 포함하는 아래 프로그램을 실행해 봅시다.
public class SwitchExpressions {
public static void main(String[] args)
{
System.out.println("New Switch Expression result:");
executeNewSwitchExpression("M");
executeNewSwitchExpression("TH");
executeNewSwitchExpression("");
executeNewSwitchExpression("SUN");
}
public static void executeNewSwitchExpression(String day){
String result = switch (day) {
case "M", "W", "F" -> "MWF";
case "T", "TH", "S" -> "TTS";
default -> {
if(day.isEmpty())
break "Please insert a valid day.";
else
break "Looks like a Sunday.";
}
};
System.out.println(result);
}
}
이것은 미리보기 기능이므로 Java 12 미리보기 언어 수준을 선택했는지 확인하십시오. 위의 코드를 컴파일하려면 다음 명령을 실행하십시오 :
javac -Xlint:preview --enable-preview -source 12 src/main/java/SwitchExpressions.java
컴파일된 프로그램을 실행한 후 콘솔에 다음이 표시됩니다.

스위치 표현식은 미리보기 언어 기능입니다. 이는 완성되었지만 향후 Java 릴리스에서 확인되지 않을 수 있음을 의미합니다.
2. File.mismatch 메서드
Java 12에는 두 개의 파일을 비교하는 다음 메서드가 추가되었습니다.
public static long mismatch(Path path, Path path2) throws IOException
이 메서드는 처음으로 일치하지 않는 위치를 반환하거나 일치하는 위치가 없는 경우 -1L을 반환합니다. 두 파일은 다음 시나리오에서 일치하지 않을 수 있습니다.
- 바이트가 동일하지 않은 경우. 이 경우, 첫 번째 불일치하는 바이트의 위치가 반환됩니다.
- 파일 크기가 동일하지 않은 경우. 이 경우, 더 작은 파일의 크기가 반환됩니다.
IntelliJ Idea의 예제 코드 스니펫은 다음과 같습니다.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class FileMismatchExample {
public static void main(String[] args) throws IOException {
Path filePath1 = Files.createTempFile("file1", ".txt");
Path filePath2 = Files.createTempFile("file2", ".txt");
Files.writeString(filePath1,"JournalDev Test String");
Files.writeString(filePath2,"JournalDev Test String");
long mismatch = Files.mismatch(filePath1, filePath2);
System.out.println("File Mismatch position... It returns -1 if there is no mismatch");
System.out.println("Mismatch position in file1 and file2 is >>>>");
System.out.println(mismatch);
filePath1.toFile().deleteOnExit();
filePath2.toFile().deleteOnExit();
System.out.println();
Path filePath3 = Files.createTempFile("file3", ".txt");
Path filePath4 = Files.createTempFile("file4", ".txt");
Files.writeString(filePath3,"JournalDev Test String");
Files.writeString(filePath4,"JournalDev.com Test String");
long mismatch2 = Files.mismatch(filePath3, filePath4);
System.out.println("Mismatch position in file3 and file4 is >>>>");
System.out.println(mismatch2);
filePath3.toFile().deleteOnExit();
filePath4.toFile().deleteOnExit();
}
}
위의 Java 프로그램을 컴파일하고 실행했을 때의 출력은 다음과 같습니다.

3. 콤팩트한 숫자 형식
import java.text.NumberFormat;
import java.util.Locale;
public class CompactNumberFormatting {
public static void main(String[] args)
{
System.out.println("Compact Formatting is:");
NumberFormat upvotes = NumberFormat
.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
upvotes.setMaximumFractionDigits(1);
System.out.println(upvotes.format(2592) + " upvotes");
NumberFormat upvotes2 = NumberFormat
.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
upvotes2.setMaximumFractionDigits(2);
System.out.println(upvotes2.format(2011) + " upvotes");
}
}

4. Teeing Collectors
Teeing Collector는 Streams API에서 소개된 새로운 컬렉터 유틸리티입니다. 이 컬렉터에는 두 개의 컬렉터와 하나의 Bi-function이 포함되어 있습니다. 모든 입력 값은 각 컬렉터로 전달되고 결과는 Bi-function에서 사용할 수 있습니다.
double mean = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.teeing(
summingDouble(i -> i),
counting(),
(sum, n) -> sum / n));
System.out.println(mean);
출력은 3.0입니다.
5. Java Strings New Methods
Java 12에는 다음과 같이 4개의 새로운 메서드가 소개되었습니다:
- indent(int n)
- transform(Function f)
- Optional describeConstable()
- String resolveConstantDesc(MethodHandles.Lookup lookup)
위의 메서드에 대한 자세한 내용 및 구현 방법은 당사의 Java 12 String Methods 튜토리얼을 참조하십시오.
6. JEP 334: JVM Constants API
A new package java.lang.constant
is introduced with this JEP. This is not that useful for those developers who don’t use constants pool.
7. JEP 305: instanceof에 대한 패턴 매칭(미리보기)
또 다른 미리보기 언어 기능! 다른 유형으로 형 변환하는 구 방법은 다음과 같습니다:
if (obj instanceof String) {
String s = (String) obj;
// 여기서 코드에 s를 사용합니다
}
새로운 방법은 다음과 같습니다:
if (obj instanceof String s) {
// 여기서 직접 s를 사용할 수 있습니다
}
이렇게 하면 불필요한 형 변환을 몇 가지 절약할 수 있습니다.
Raw String 리터럴이 JDK 12에서 제거되었습니다.
이것으로 Java 12 기능에 관한 기사를 마칩니다.
Source:
https://www.digitalocean.com/community/tutorials/java-12-features