Java 19
레코드 패턴 매칭(프리뷰)
기존에는 instanceof
를 통해 해당 객체인지 확인 후, 형변환을 통해 객체를 사용해야 했습니다.
record Point(int x, int y) {}
public void test(Object o) {
if (o instanceof Point) {
Point p = (Point) o;
...
}
}
하지만 레코드 패턴 매칭을 통해 형변환 로직을 제거하고 record의 구성요소를 직접 추출해서 사용할 수 있습니다.
public void test1(Object o) {
if (o instanceof Point p) {
int sum = p.x + p.y;
...
}
}
public void test2(Object o) {
if (o instanceof Point(int x, int y)) {
int sum = x + y;
...
}
}
외부함수 & 메모리 API(프리뷰)
Java 프로그램이 Java 런타임 외부의 코드 및 데이터와 상호 운용될 수 있는 API를 제공합니다. JVM 외부 함수 및 메모리(JVM에서 관리하지 않는 코드 및 메모리)에 안전하게 접근함으로써 이 API는 Java 프로그램이 위험없이 네이티브 라이브러리를 호출하고 데이터를 처리할 수 있도록 지원합니다.
가상 스레드(프리뷰)
일반적으로 Java에서 제공하는 스레드는 플랫폼 스레드라고 합니다. 플랫폼 스레드는 기본 OS 스레드에서 Java 코드를 실행하고 코드의 전체 수명동안 OS 스레드를 캡처합니다. 그래서 스레드의 수는 OS 스레드 수로 제한됩니다. OS 스레드는 비용이 많이 들기 때문에 너무 많이 만들 수 없습니다.
가상 스레드는 JDK에서 제공하는 가볍게 구현한 스레드입니다. 이는 사용자 모드 스레드의 한 형태로 하나의 OS 스레드 위에 여러 개가 존재할 수 있습니다.
switch 패턴 매칭(프리뷰)
스위치에 패턴 매칭을 적용하게 되었습니다.
static String formatter(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
}
그리고 when 절을 도입하여 switch ~ case 문 내에서 if문이 간소화 되었습니다.
public void test1(Object o) {
switch (o) {
case Integer i: if (i > 10) {...}
}
}
public void test2(Object o) {
switch (o) {
case Integer i when i > 10 -> ...
}
}
Structured Concurrency API(인큐베이터 단계)
개발자는 병렬 처리를 위해 여러 개의 스레드를 생성해서 작업을 처리합니다. 하지만 계속 생성될 수 있는 많은 스레드를 관리하기는 어렵습니다. 스레드 관리의 난이도를 낮추기 위해 StructuredTaskScope
를 사용합니다.
StructuredTaskScope
를 통해 개발자는 작업을 동시 하위 작업의 집합으로 구성하고 이를 하나의 단위로 조정할 수 있습니다. 하위 작업은 개별적으로 fork 한 후 하나의 단위로 join되고 경우에 따라 자체 스레드에서 실행됩니다.
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Future<String> future = scope.fork(() -> {
// 비동기 작업 수행
return "result";
});
scope.join();
System.out.println(future.resultNow());
}