[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);
    }
}

 

 

참고

https://velog.io/@jinyeong-afk/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-Java-11-vs-Java-17-%EC%B0%A8%EC%9D%B4

 

[기술 면접] 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