검토 하는 이유
- 사실 가장 큰 이유는 Spring Boot 때문..
- Spring Boot 2까지는 Java 8이 최소 지원 버전이었지만, Spring Boot 3 부터는 Java 17이 최소 지원 버전이다.
- 다른 언어들에는 이미 존재하는 문법적인 장점들이 업데이트 되고 있다.
JDK 17 (LTS)
출시일: 2021년 09월
End Of Support: 2029년 9월
주요 변경점
JEP 286: Local-Variable Type Inference JAVA 10
- 지역 변수의 타입 추론
1 2
var list = new ArrayList<String>(); // infers ArrayList<String> var stream = list.stream(); // infers Stream<String>
주의할 점은 var list의 타입은 List
이 아니라 ArrayList 이다.
JEP 361: Switch Expressions JAVA 14
switch가 표현식으로 사용될 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Old code
int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
numLetters = 0;
}
// New code
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> 0;
};
JEP 358: Helpful NullPointerExceptions JAVA 14
NPE가 어디서 발생했는지 좀 더 도움되는 정보를 준다.
1
2
3
List<String> list = null;
String string = list.get(0).toString();
System.out.println(string);
- 기존 에러 메시지
Exception in thread “main” java.lang.NullPointerException
- java 14에서 변경된 에러 메시지
Cannot invoke “java.util.List.get(int)” because “list” is null
java.lang.NullPointerException: Cannot invoke “java.util.List.get(int)” because “list” is null
JEP 378: Text Blocks JAVA 15
multiline 처리, escape 없이 사용 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Using "one-dimensional" string literals
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
// Using a "two-dimensional" block of text
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
JEP 394: Pattern Matching for instanceof JAVA 16
패턴이 일치하면 패턴 변수에 값을 할당한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Old code
if (o instanceof String) {
String s = (String)o;
System.out.println(s);
}
// New code
if (o instanceof String s) {
System.out.println(s);
}
// New code - 이 경우에는 if block 이후에도 s 변수 사용이 가능하다.
if (!(o instanceof String s)) {
throw new RuntimeException();
}
System.out.println(s);
JEP 395: Records JAVA 16
간편하게 불변 객체 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Old code
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);
}
}
// New code
record Point(int x, int y) {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
JEP 409: Sealed Classes JAVA 17
봉인된 클래스 또는 인터페이스는 허용된 클래스 및 인터페이스에 의해서만 확장되거나 구현될 수 있다.
sealed 클래스는 permits로 상속 가능한 하위 타입을 지정 해야 한다.
sealed 타입을 상속한 타입에는 제약사항이 존재한다.
다음 3가지 중 하나를 지정해야 한다.
- final: 상속 불가
- non-sealed: 하위 타입을 제한하지 않는다.
- sealed: 상속 가능한 하위 타입을 제한
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public sealed class Shape permits Circle, Square, Triangle {
}
public final class Circle extends Shape {
public float radius;
}
public non-sealed class Square extends Shape {
public double side;
}
public sealed class Triangle extends Shape permits ColoredTriangle {
public double height, base;
}