이 글은 Velog에서 이전한 글입니다. Velog 원문 보기
24년도에 진행한 두 개의 프로젝트 Sucat, 스스LAW에서 나는 모두 Java17을 선택해서 사용했다.
이번 글에서는 Java8, Java11, Java14, Java17 ... 등 많은 버전에서 Java17을 선택한 이유를 작성해보려고 한다.
참고로 Spring Boot 3.0부터는 Java17부터 지원하고 있기 때문에 Spring Boot 3.0 이후 버전을 고려하고 있다면 Java17 이상을 도입해야 한다.
⭐️ Java17? 다른 버전과 차이가 뭔데?
Java11
Java8과 경쟁 상대로 가장 많이 언급되었던 것은 Java11이다. 그 이유는 우선 LTS였기 때문이다.
Oracle에서 Java8을 사용한 레거시 프로젝트들이 너무 많은 것을 고려하여 Java8이 Java11보다 더 긴 지원기간을 갖게 되었다.
Java11은 26년 9월 이후부터 기술적 지원이 종료된다.
📌 Java8
- Lambda
- Stream
- interface default Method
- Optional
- LocalDataTime
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를 사용할 수 있으며, 필요시 오버라이드하여 사용할 수 있다.
📌 Java9
- 모듈화(Jigsaw)
- stream
- takeWhile, dropWhile, iterate 등 추가
- optional
- inPresentOrElse 추가
- interface
- private method 추가
📌 Java10
- var 추가
- Garbage Collector(GC) 병렬 처리 도입으로 인한 성능 향상
- JVM heap 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능
📌 Java11
- LTS
- Oracle JDK와 OpenJDK 통합
- Oracle JDK가 구독형 유료 모델로 전환
- Lambda에 var 사용 가능
- Java10부터 Java 소스 파일을 먼저 컴파일 하지 않고도 실행할 수 있다.
- 이전 java는 소스를 컴파일하여 class로 뽑은 후 class를 실행했는데 바로 실행할 수 있게 되었다.
📌 Java12
- 유니코드 11 지원
- swich문 확장
확장된 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 -> "휴일";
};
📌 Java13
- 유니코드 12.1 지원
- switch 개선
- Multi line String 개선
개선된 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>
"""*;
📌 Java14
- switch 표준화
- instanceof 개선
- record 선언 기능 추가
- NullPointerException 개선
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) { }
📌 Java15
- 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)
- Sealed Classes
- Nashorn JavaScript Engine 제거
- Java에서 JavaScript를 실행할 수 있었던 Engine
📌 Java16
- Unix-Domain Socket Channels 사용 가능 (Mac 및 Windows(10+)에도 지원)
📌 Java17
- Java11 이후 새로운 LTS
- Pattern Matching for switch
- Sealed Classes (Finalized)
- Java15에서 제공되었던 Sealed Classes 기능 완료
- Foreign Function & Memory API
- Java Native Interface(JNL)를 대체
- Deprecating the Security Manager
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"*;
};
}
객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다.
⭐️ Java17 버전을 선택한 이유
- Java11과 마찬가지로 LTS이다.
- 새로운 기능과 개선된 API
- Java17에서는 다양한 새로운 기능과 API 개선이 이루어졌다. 예를 들어, 'Sealed Classes'가 도입되어 클래스의 상속을 제한하고, 'Pattern Matching for switch'가 확장되어 패턴 매핑 기능이 향상되었다.
- 암호화 관련 업데이트
- Java17에서는 암호화와 보안 관련 업데이트가 이루어졌다. 암호화 알고리즘과 보안 기능의 업데이트로 애플리케이션의 보안성이 향상되었다.
- 언어 및 컴파일러 개선
- Java17에서는 언어 및 컴파일러 개선이 이루어져 더 나은 코드 작성이 가능해졌다.
- Deprecation과 Removal
- Java17에서는 일부 구식된 기능들이 표시되어 Deprecated 상태로 변경되거나, 더 이상 사용되지 않는 기능들이 제거되었다.
- 성능 개선
- Java17은 전반적으로 성능 개선이 이루어져 더 빠르고 효율적인 실행이 가능해졌다.
위와 같은 이유들이 있지만 가장 큰 이유는 Spring Boot 3.0 이후부터는 Java17 이후 버전만 지원하기 때문이다.
'Language·CS > Concepts' 카테고리의 다른 글
| ✏️ [Security] OIDC(OpenID Connect) (0) | 2026.07.31 |
|---|---|
| [Java] 컴파일 과정 (0) | 2026.07.31 |
| ✏️ [Java] Spring WebFlux - 비동기 처리 이해하기 (0) | 2026.07.31 |
| ✏️ 모놀리식 아키텍처(MA) VS 마이크로 서비스 아키텍처(MSA) (0) | 2026.07.30 |
| ✏️ CI/CD에 대해 알아보자 With Github Actions (0) | 2026.07.30 |