Home Java 8 에서 Java 17 까지의 변경점 정리
Post
Cancel

Java 8 에서 Java 17 까지의 변경점 정리

검토 하는 이유

  • 사실 가장 큰 이유는 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;
}

참고

This post is licensed under CC BY 4.0 by the author.