jdk8 이후 문법 공부 안하셨죠?(저도 그래요😄) Amber 프로젝트를 알면 Java의 주요 언어 변경사항에 대해 쭉 정리가 됩니다.
## Project Amber
- 소개
Project Amber의 목표는 [OpenJDK JEP 프로세스](https://openjdk.org/jeps/1) 에서 JEP 후보로 승인된 더 작고 생산성 지향적인 Java 언어 기능을 탐색하고 배양하는 것입니다 . 이 프로젝트는 [컴파일러 그룹](https://openjdk.org/groups/compiler) 의 후원을 받습니다 .
대부분의 Project Amber 기능은 Java 플랫폼의 공식 부분이 되기 전에 최소한 두 번의 [_미리보기를 거칩니다._](https://openjdk.org/jeps/12) 특정 기능에 대해 각 미리보기 라운드와 최종 표준화를 위한 별도의 JEP가 있습니다. 이 페이지는 기능에 대한 최신 JEP에만 연결됩니다. 이러한 JEP에는 해당 기능에 대한 이전 JEP에 대한 링크가 있을 수 있습니다.
(https://openjdk.org/projects/amber/ 에서 발췌 번역함)
[!NOTE] JEP
- JDK Enhancement-Proposal & Roadmap Process
- amber 프로젝트는 이런 실험적인 생각들을 배양하는 프로젝트이다.
- JSR로 발전할 수 도 있고 아닐 수도 있다.
- 진행중인 JEP들을 가만히 보면 Javascript의 구조할당분해 기능과 유사한 제안이 많다. Python에도 유사 기능이 있다.
```js
const { name, age } = { name: 'matthew', age: 23 }
```
- record는 데이터 전달 객체를 많이 다루는 java 에서 불변객체로 만들기 위한 노력이 많이 드는 것을 극복하기 위해 만들어졌다.
```java
class Point {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
int x() { return x; }
int y() { return y; }
public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point other = (Point) o;
return other.x == x && other.y = y;
}
public int hashCode() {
return Objects.hash(x, y);
}
public String toString() {
return String.format("Point[x=%d, y=%d]", x, y);
}
}
```
- "var"라는게 있는지 모르는 개발자도 많을 걸?
```java
// jdk 10
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
// jdk 11 부터는 람다식에도 쓸 수 있다.
(var x, var y) -> x.process(y)
// 람다식은 원래 타입추론이므로 적어줄 필요가 없는데
// 굳이 var를 적어줘야하는 이유는 아래처럼 annotation을 쓸 수 있다.
@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
```
- [JEP 459: String Templates (Second Preview)](https://openjdk.org/jeps/459) 이런 것도 진행중입니다.
## 코딩해봅시다
```java
@RestController
@SpringBootApplication
public class DemoSpringApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringApplication.class, args);
}
@GetMapping("/greeting")
public String greeting(@RequestParam String name) {
// arrow, inline : jdk 14 이상
Loan loan = switch(name) {
case "matthew" -> new SecuredLoan();
default -> new UnSecuredLoan(0.0047f);
};
// yield : jdk 14 이상
// pattern matching : jdk 21 이상
String message = switch(loan) {
case SecuredLoan secureLoan -> name + " 무이자“;
case UnSecuredLoan usl -> {
yield name + " : " + usl.interest;
}
};
return message;
}
// sealed 클래스/인터페이스 : jdk 17 이상
// permits 키워드를 이용하여 상속 / 구현 할 클래스를 미리 지정한다.
sealed interface Loan permits SecuredLoan, UnSecuredLoan {}
// seald 클래스 / 인터페이스를 상속 / 구현하는 클래스는 final 필수
final class SecuredLoan implements Loan {}
record UnSecuredLoan (float interest) implements Loan {}
}
```
## when
```java
String s = switch (score) {
case 100 -> "Perfect!";
case Integer i when i >= 90 -> "Very Good!";
case Integer i when i >= 80 -> "Good!";
default -> "Bad";
}
```
## null
```java
return switch(value) {
case null, default -> "default";
case 1 -> A;
case 2 -> B;
}
```
## Record Pattern
```java
// jdk 16
if (obj instanceof Student student) {
student.study();
String name = student.getName():
System.out.println(name);
}
```
```java
// jdk 21
if (obj instanceof Student(String name)) {
student.study();
System.out.println(name);
}
```
## for 문
```java
Iterable<String> iterable = ...;
for (String s: iterable) {
// Do something with s
}
// 이렇게 쓰던걸 아래처럼 ...
///////////////////////////////////////
record Point(double x, double y) {}
List<Points> points = ...;
for (Point(double x, double y): points) {
// Do something with x and y
}
```
댓글
댓글 쓰기