Java : Project Amber

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
}
```

댓글

이 블로그의 인기 게시물

Session 대신 JWT를 사용하는 이유

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

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