JDK 22 features


# JDK 22 
- 들어가기 전에
- Features
- Previews
- Incubators
- 요약
---
### 들어가기 전에
- 2025년에 JavaOne 재개된다고 합니다. 2025년은 java 30주년이 되는 해입니다.
	- 30년을 버틴 프로그래밍 언어가 몇 개나 될까요?
- General Availablility : 2024/03/19
- preview와 incubator는 관심있으신 분들만 보시면 될 듯 합니다. 
	- 언제 정식으로 포함될 지 모르니
    
---
## Features
- 메모리, JNI 관련
	- JEP 423: Region Pinning for G1
	- JEP 454: Foreign Function & Memory API
- 언어 스펙
	- JEP 456: Unnamed Variables & Patterns
- 메이븐 죽이기?
	- JEP 458: Launch Multi-File Source-Code Programs
    
---

### JEP 423: Region Pinning for G1
- component : hospot / gc (hotspot)
- 요약 : G1에서 영역 고정을 구현하여 대기 시간을 줄이므로 Java Native Interface(JNI) 중요 영역 동안 가비지 수집을 비활성화할 필요가 없습니다.
- JNI : 하드웨어 또는 운영체제에 종속적인 응용프로그램들, C, C++, 어셈블리 등 다른 언어로 작성된 라이브러리들을 호출하거나 그 반대의 경우를 가능하게 하는 프레임워크
- GC가 비활성화 되었을 때, 메모리 부족, VM종료 등의 상황이 발생할 수 있다.

---

### JEP 454: Foreign Function & Memory API
- component : core-libs / java.lang.foreign (panama)
- third preview 까지 진행 되었었네요. jdk19 preview로 시작.
- 요약 : JVM 외부 코드를 효출적으로 호출하고 JVM에서 관리하지 않는 메모리에 안전하게 접근할 수 있게 한다..
- 텐서플로, 루씬, 네띠 와 같이 성능이 중요한 경우 off-heap 메모리에서 관리 되어야한다. 기존에는 두 가지 방법을 제공했다. ByteBuffer API, sun.misc.Unsafe API
- JDBC, HTTP client, NIO channels, Unix-domain sockets 등
- 약어로 FFM API 라고 하네요

---

### JEP 456: Unnamed Variables & Patterns
- component : specification / language (amber)
- 요약 : 매개변수가 절대 사용되지 않을 때 '`_`' 를 사용
- 이름이 지정되지 않는 필드나 메서드 매개변수를 허용하려 만든 것은 아니다.
- (주의) `_`를 변수로 사용하는 기존의 코드가 없다고 가정했다.

---

#### 사용되지 않는 변수 (1/2)
```java
static int count(Iterable orders) {
    int total = 0;
    for (Order order : orders)    // order is unused
        total++;
    return total;
}
```

- 정적 분석 도구는 사용되지 않는 변수에 대해 경고를 표시할 수도 있다.

```java
static int count(Iterable orders) {
    int total = 0;
    for (Order _ : orders)    // Unnamed variable
        total++;
    return total;
}
```
---

#### 사용되지 않는 변수 (2/2)
```java
String s = ...;
try {
    int i = Integer.parseInt(s);
    ... i ...
} catch (NumberFormatException ex) {    // ex is unused
    System.out.println("Bad number: " + s);
}
```

```java
String s = ...
try {
    int i = Integer.parseInt(s);
    ... i ...
} catch (NumberFormatException _) {        // Unnamed variable
    System.out.println("Bad number: " + s);
}
```
---

#### 사용되지 않는 패턴변수
```java
ealed abstract class Ball permits RedBall, BlueBall, GreenBall { }
final  class RedBall   extends Ball { }
final  class BlueBall  extends Ball { }
final  class GreenBall extends Ball { }
```

```java
Ball ball = ...
switch (ball) {
    case RedBall   red   -> process(ball);   // red 사용안됨
    case BlueBall  blue  -> process(ball);   // blue 사용안됨
    case GreenBall green -> stopProcessing();// green 사용안됨
}
```

```java
switch (ball) {
    case RedBall _   -> process(ball);          // Unnamed pattern variable
    case BlueBall _  -> process(ball);          // Unnamed pattern variable
    case GreenBall _ -> stopProcessing();       // Unnamed pattern variable
}
```

---

### JEP 458: Launch Multi-File Source-Code Programs
- component : tools / launcher (compiler)
- 요약 
- 외부 라이브러리 종속성을 쉽게 사용하는 것이 목표는 아니다.

---

#### JDK 11에서 지원했던 방법
```java
// Prog.java 아래 두개의 클래스를 포함하고 있다.
class Prog {
    public static void main(String[] args) { Helper.run(); }
}
class Helper {
    static void run() { System.out.println("Hello!"); }
}
```

```sh
$ java Prog.java
```
- 멀티파일이라면 얘기가 달라진다.

---

#### 멀티 파일로 구성
- 테스트해봅시다. 
```java
// App.java
import help.Helper;
class App {
    public static void main(String[] args) { Helper.run(); }
}

// Helper.java
package help;
class Helper {
    static void run() { System.out.println("Hello!"); }
}
```

---
## Previews
- 447: Statements before super(...) (Preview)
- 457: Class-File API (Preview)
- 461: Stream Gatherers (Preview)
- 459: String Templates (Second Preview)
- 462: Structured Concurrency (Second Preview)
- 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
- 464: Scoped Values (Second Preview)

---
## Incubators
- 460: Vector API (Seventh Incubator)

---

## 요약
- JNI 를 사용할 때 외부 메모리 관리와 관련된 업데이트
	- Exception이 조금은 줄어들까?
- `_` 로 변수명을 사용했던 것들은 리팩토링합시다.
- 아직은 아니지만 java 진영의 빌드 도구, IDE 들이 많이 바뀔듯.

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

VSCode에서의 VIM 단축키와 키보드 구매 가이드

우분투에서 테스트링크(testlink)와 맨티스(mantis)로 테스팅 서버 구성하기