[Java] Java 11 vs Java 17
2023. 11. 11. 14:19ㆍ개발지식/Java
Java 11
- 인터페이스 내 Private 메소드: Java 11부터 인터페이스 내에서 private 메소드를 정의할 수 있게 되었습니다. 이를 통해 인터페이스 내에서만 사용되는 코드를 숨기고 재사용할 수 있게 되어 인터페이스의 캡슐화가 강화되었습니다.
- OpenJDK와 Oracle JDK의 통합: Oracle JDK와 OpenJDK의 차이점이 대부분 제거되었습니다. 이제 Oracle JDK는 OpenJDK의 상업적 버전으로 간주되며, 대부분의 기능이 OpenJDK와 동일합니다.
- G1 Garbage Collector (GC) 기본 설정: G1 GC는 Java 11에서 기본 가비지 컬렉터로 설정되었습니다. 이 GC는 대규모 힙에서도 짧은 가비지 컬렉션 지연 시간을 제공하여 성능을 개선합니다.
- 람다 표현식에서의 Local-Variable Syntax for Lambda Parameters (var 키워드 사용): Java 11은 람다 표현식의 매개변수에 var 키워드를 사용할 수 있게 해, 코드의 일관성을 높이고 타입 추론을 강화합니다.
- 컬렉션과 스트림 API의 개선: 새로운 메소드들이 컬렉션과 스트림 API에 추가되어, 개발자가 데이터를 더 효율적으로 처리하고 조작할 수 있게 되었습니다.
- 지역 변수에 대한 Final 효과 확장: 이전 버전의 Java에서는 명시적으로 final 키워드를 사용해야 했지만, Java 11부터는 지역 변수에 대해 암시적으로 final 효과가 적용됩니다. 이는 코드의 가독성과 안정성을 개선합니다.
Java 17
- record 클래스 키워드 사용 가능: Java 17은 데이터 전송 객체를 위한 새로운 유형인 record를 도입했습니다. 이를 통해 클래스 선언이 훨씬 간결해지고, 데이터를 저장하고 검색하는 용도로 사용됩니다.
- 난수 생성 API 추가: 새로운 난수 생성 API가 추가되어, 다양한 유형의 난수 생성기를 더 쉽게 사용할 수 있게 되었습니다. 이를 통해 개발자는 특정 상황에 맞는 난수 생성기를 선택할 수 있습니다.
- 봉인 클래스(Sealed Class) 정식 추가: 봉인 클래스는 클래스 계층을 더 명확하게 제한하는 기능을 제공합니다. 이를 통해 특정 클래스가 어떤 하위 클래스를 가질 수 있는지 제한하고, 유지 보수성과 안정성을 높일 수 있습니다.
- String 여러 줄 사용시 텍스트 블록 기능 사용 가능: Java 17은 여러 줄에 걸친 문자열을 편리하게 표현할 수 있는 텍스트 블록 기능을 제공합니다. 이를 통해 HTML, JSON, SQL 쿼리문 등을 손쉽게 작성할 수 있습니다.
- NumberFormat과 DateTimeFormatter 기능 향상: 이 두 클래스는 숫자와 날짜/시간 형식을 더 다양하고 유연하게 처리할 수 있는 새로운 기능들을 추가했습니다.
- Stream.toList() 사용 가능: 이 메소드는 스트림의 결과를 쉽게 리스트로 변환할 수 있도록 합니다. 이는 불변 리스트를 생성하는 편리한 방법을 제공합니다.
- NullPointerException 설명 기능: Java 17은 NullPointerException이 발생했을 때 어떤 변수 때문에 발생했는지를 설명해주는 기능을 추가했습니다. 이는 디버깅 과정을 더욱 간단하고 효율적으로 만듭니다.
- ZGC (Z Garbage Collector) 도입: ZGC는 대규모 힙과 낮은 응답 시간을 목표로 하는 새로운 가비지 컬렉터입니다. 이를 통해 더 큰 애플리케이션에서도 낮은 지연 시간을 유지할 수 있습니다.
Java 11
public class Dto {
private final int data;
public Dto(int data) {
this.data = data;
}
public int getData() {
return data;
}
}
lombok 사용
@Getter
@AllArgsConstructor
public class Dto {
private final int data;
}
Java 17
public record Record(int data) {
}
toList() method
Java 11
public class ToListWith11 {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
.filter(i -> i > 3)
.collect(Collectors.toList());
System.out.println(result);
}
}
Java 17
public class ToListWith17 {
public static void main(String[] args) {
List<Integer> list = List.of(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
.filter(i -> i > 3)
.toList();
System.out.println(result);
}
}
Collectors.toList() 대신 toList() 만으로도 사용할 수 있습니다.
Switch Expression
Java 11
public class SwitchWith11 {
public static void main(String[] args) {
String day = "Sunday";
int result = 0;
switch (day) {
case "Monday":
result = 1;
break;
case "Tuesday":
result = 2;
break;
case "Wednesday":
result = 3;
break;
case "Thursday":
result = 4;
break;
case "Friday":
result = 5;
break;
case "Saturday":
result = 6;
break;
case "Sunday":
result = 7;
break;
}
System.out.println(result);
}
}
Java 17
public class SwitchWith17 {
public static void main(String[] args) {
String day = "Sunday";
int result = switch (day) {
case "Monday" -> 1;
case "Tuesday" -> 2;
case "Wednesday" -> 3;
case "Thursday" -> 4;
case "Friday" -> 5;
case "Saturday" -> 6;
case "Sunday" -> 7;
default -> 0;
};
System.out.println(result);
}
}
참고
[기술 면접] Java 11 vs Java 17 차이
인터페이스에 private 메서드 가능Open JDK와 Oracle JDK 통합G1 GC가 기본 GC로 설정람다 지역변수 var 키워드 사용 가능컬렉션, 스트림 등 메소드 추가지역 변수의 final 효과 확장recode class 키워드 사용
velog.io
https://be-student.tistory.com/86#instanceof%20pattern%20matching-1
우리 프로젝트에서 java 17을 사용하게 된 이유
우아한테크코스에서 자바 11을 사용하는 것이 너무 익숙해진 상황이어서, java 11 대신 java 17을 쓰려면 쓰는 대신, 왜 java 17을 쓰면 좋은지에 대해서 설득을 하는 시간이 있어야 하는데요 처음에는
be-student.tistory.com
'개발지식 > Java' 카테고리의 다른 글
Scanner vs BufferedReader (1) | 2024.10.07 |
---|---|
좋은 객체 지향 설계의 5가지 원칙(SOLID) (1) | 2023.12.30 |
[Java] 변수와 자료형 (1) | 2023.12.20 |
[Java] JDK, JRE, JVM 이란? (자바 개발 환경 구축) (0) | 2023.12.20 |