24년도에 진행한 두 개의 프로젝트 Sucat
, 스스LAW
에서 나는 모두 Java17을 선택해서 사용했다.
이번 글에서는 Java8, Java11, Java14, Java17 ... 등 많은 버전에서 Java17을 선택한 이유를 작성해보려고 한다.
참고로 Spring Boot 3.0부터는 Java17부터 지원하고 있기 때문에 Spring Boot 3.0 이후 버전을 고려하고 있다면 Java17 이상을 도입해야 한다.
Java11
Java8과 경쟁 상대로 가장 많이 언급되었던 것은 Java11이다. 그 이유는 우선 LTS였기 때문이다.
Oracle에서 Java8을 사용한 레거시 프로젝트들이 너무 많은 것을 고려하여 Java8이 Java11보다 더 긴 지원기간을 갖게 되었다.
Java11은 26년 9월 이후부터 기술적 지원이 종료된다.
interface default Method
기존 interface는 추상 메서드만을 정의할 수 있었는데 default 선언을 통해 method를 미리 정의해둘 수 있다. 또한 정의된 default method는 상속된 class에서 오버라이딩 될 수 있다.
public interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
default int exec(int i, int j){ //default로 선언함으로 메소드를 구현할 수 있다.
return i + j;
}
}
//Calculator인터페이스를 구현한 MyCalculator클래스
public class MyCalculator implements Calculator {
@Override
public int plus(int i, int j) {
return i + j;
}
@Override
public int multiple(int i, int j) {
return i * j;
}
}
public class MyCalculatorExam {
public static void main(String[] args){
Calculator cal = new MyCalculator();
int value = cal.exec(5, 10);
System.out.println(value);
}
}
default method로 선언되면 상속받은 class에서 따로 구현하지 않아도 exec method를 사용할 수 있으며, 필요시 오버라이드하여 사용할 수 있다.
확장된 swich 문
//java 12 이전
String time;
switch (weekday) {
case MONDAY:
case FRIDAY:
time = "10:00-18:00";
break;
case TUESDAY:
case THURSDAY:
time = "10:00-14:00";
break;
default:
time = "휴일";
}
//java12 이후
String time = switch (weekday) {
case MONDAY, FRIDAY -> "10:00-18:00";
case TUESDAY, THURSDAY -> "10:00-14:00";
default -> "휴일";
};
개선된 switch
boolean result = switch (status) {
case SUBSCRIBER -> true;
case FREE_TRIAL -> false;
default -> throw new IllegalArgumentException(*"something is murky!"*);
};
개선된 switch
//Java 13 이전
String htmlBeforeJava13 = *"<html>\n"* +
*" <body>\n"* +
*" <p>Hello, world</p>\n"* +
*" </body>\n"* +
*"</html>\n"*;
//Java 13 이후
String htmlWithJava13 = *"""
<html>
<body>
<p>Hello, world</p>
</body>
</html>
"""*;
switch 표준화
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
default -> {
String s = day.toString();
int result = s.length();
yield result;
}
};
instanceof 개선
//Java 14 이전
if (obj instanceof String) {
String s = (String) obj;
}
//Java 14 이후
if (obj instanceof String s) {
System.out.println(s.contains(*"hello"*));
}
record
// Java 14 이전
// Java 14 이전에는 다음과 같이 선언 시 equals/hashcode, toString 잠재적으로 포함되었다.
final class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
// Java 14 이후
record Point(int x, int y) { }
Pattern Matching for switch
public String test(Object obj) {
return switch(obj) {
case Integer i -> *"An integer"*;
case String s -> *"A string"*;
case Cat c -> *"A Cat"*;
default -> *"I don't know what it is"*;
};
}
객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다.
Java11과 마찬가지로 LTS이다.
새로운 기능과 개선된 API
암호화 관련 업데이트
언어 및 컴파일러 개선
Deprecation과 Removal
성능 개선
위와 같은 이유들이 있지만 가장 큰 이유는 Spring Boot 3.0 이후부터는 Java17 이후 버전만 지원하기 때문이다.