본문 바로가기
자바

java11과 17의 차이

by 진믈리 2024. 9. 3.
예약 도메인 프로젝트 계획에서 java11 -> java17로 마이그레이션 하는 계획을 세웠다. 프로젝트를 시작하기 전에 자바 버전별 특징이 어떤것들이 있는지 한번 알아보려 공식문서를 찾아보았다.

JAVA11

1.새로운 String 메서드 추가

isBlank()

public void blankTest(){
        String blankString1 = "";
        String blankString2 = "       ";
        String blankString3 = "not   blank";
//        String blankString4 = null; //null에는 사용할 수 없다. NullPointerException 발생
        assertThat(blankString1.isBlank()).isTrue();
        assertThat(blankString2.isBlank()).isTrue();
        assertThat(blankString3.isBlank()).isFalse();
    }

lines()

  • lines() 메서드는 Strem<String> 을 반환하므로 스트림 API의 다른 기능들과 조합하여 사용할 수 있다.

repeat()

이 메서드는 현재 문자열을 횟수만큼 반복하여 새로운 문자열을 반환한다.

 

2. 람다표현식에서 매개변수로 var 사용 가능

(var x, var y) -> x.process(y)

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8193259

 

3.ZGC  확장 가능한 저지연 Garbage Collector

다음 목표를 충족하도록 설계되었다.

  • 일시 정지 시간은 10ms를 초과하지 않는다.
  • 일시 정지 시간은 힙 또는 라이브 세트 크기에 따라 증가하지 않는다.
  • 수백 메가바이트에서 수 테라바이트 크기에 이르는 힙를 처리한다.

https://www.oracle.com/java/technologies/javase/11-relnote-issues.html#NewFeature

 

4. HTTP API의 표준화 

  • 'java.net.http' 패키지에서 표준화된 API를 제공한다.
  • HttpURLConnection 대체 가능

HttpURLConnectiohttps://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8181784

 

5.Epsilon, No-Op 가비지콜렉터

무작업 가비지 수집기이다. Epsilon GC는 메모리 할당만 처리하며 메모리 회수 메커니즘을 구현하지는 않는다. 

성능 테스트에 유용하다.

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8174901

 

 

Java17

https://openjdk.org/projects/jdk/17/

1. Text Blocks

여러줄의 문자열을 쉽게 표현할 수 있는 덱스트 블록(""") 이 추가 되었다.

@Test
void textBlockTest(){

    String str = """
            hi
            my name is
            Jinmlee
            """;
}

 

2. Sealed 클래스

public sealed class Animal permits Dog, Cat, Bird {
}
final class Cat extends Animal{
}
final class Dog extends Animal{
}
non-sealed class Bird extends Animal{
}
class Sparrow extends Bird{
}
  • Animal 클래스는 sealed로 선언하였으며 이 클래스의 하위 클래스는 Dog, Cat 으로 제한된다.
  • permits 키워드를 사용하여 하위 클래스를 명시한다.
  • 하위 클래스는 final로 선언되어 더이상 상속될 수 없다.
  • non-sealed 를 선언하면 추가적인 하위 클래스를 가질 수 있다.

https://docs.oracle.com/en/java/javase/17/language/sealed-classes-and-interfaces.html#GUID-0C709461-CC33-419A-82BF-61461336E65F

3. Stream.toList()기능 추가

@Test
void toListTest(){

    String animal = "Dog,Cat,Bird";

    List<String> animalList1 = Arrays.stream(animal.split(",")).toList();
    List<String> animalList2 = Arrays.stream(animal.split(",")).collect(Collectors.toList());
}

기존 Stream을 List로 변환시 Collectors에서 기능을 찾아 사용했다면 Java17 부터는 Collectors 호출 없이 toList()만으로 변환이 가능

 

4. Instanceof 매칭

@Test
void instanceOfTest(){
    Object obj = "Hello, World!";

    if (obj instanceof String) { // 기존방식
        String str = (String) obj;
        System.out.println(str.toUpperCase());
    }

    if (obj instanceof String str) {
        System.out.println(str.toUpperCase());  // 캐스팅 없이 바로 사용 가능
    }
}

이전 버전의 경우 객체를 캐스팅 하는 과정이 필요했으나 캐스팅 과정을 내부에서 지원할 수 있도록 변경

 

조건부 패턴매칭

@Test
void instanceOfTest2(){
    Object obj = "Hello, World!";

    if (obj instanceof String str && str.length() > 5) {
        System.out.println("Long string: " + str);
    }
}

obj가 String 타입인지 확인한 후 추가로 문자열의 길이가 5보다 큰지를 검사한다. 이렇게 매칭 기능이 추가되면서 조건도 검사 할 수 있게 되었다.

https://docs.oracle.com/en/java/javase/17/language/pattern-matching-switch-expressions-and-statements.html#GUID-E69EEA63-E204-41B4-AA7F-D58B26A3B232

 

4. 향상된 의사 난수 생성기

기존의 Random 클래스에 더해 다양한 Pseudo Random Number Generator 인터페이스 타입과 구현을 제공

@Test
void RandomGeneratorTest(){
    // 특정 PRNG 구현체를 생성
    RandomGenerator rng = RandomGeneratorFactory.of("L32X64MixRandom").create();

    // 난수 생성
    int randomInt = rng.nextInt(10);
    double randomDouble = rng.nextDouble();

    System.out.println("Random Integer: " + randomInt);
    System.out.println("Random Double: " + randomDouble);
}

https://openjdk.org/jeps/356

PRNG 구현체들은 챗 지피티를 참고했다.

 

5.Record Class

record 클래스는 불변 데이터 클래스를 간결하게 정의 할 수 있는 기능이다.

public record Pointer(int x, int y) {}

@Test
void recordTest(){

    Pointer point = new Pointer(10, 20);

    // 자동 생성된 toString() 사용
    System.out.println(point); // 출력: Point[x=10, y=20]

    // 자동 생성된 getter 메서드 사용
    System.out.println("x = " + point.x()); // 출력: x = 10
    System.out.println("y = " + point.y()); // 출력: y = 20
}

위의 Pointer 라는 Record 클래스가 정의 되었으며 이 클래스는 x, y 두개의 필드를 가지고 있다.

 

레코드 클래스는 필드가 불변이다. 즉 한번 설정되 필드는 변경할 수 없다.

이로 인해 setter 메서드가 없고 필드를 설정하는 것은 오직 생성자를 통해서만 가능하다.

https://docs.oracle.com/en/java/javase/16/language/records.html#GUID-6699E26F-4A9B-4393-A08B-1E47D4B2D263

 

 

 

 

참고 자료 링크

https://www.oracle.com/java/technologies/javase/11-relnote-issues.html#NewFeature

https://docs.oracle.com/en/java/javase/17/language/java-language-changes.html#GUID-6459681C-6881-45D8-B0DB-395D1BD6DB9B

'자바' 카테고리의 다른 글

객체지향 설계 5원칙  (0) 2024.07.06
메모리와 StackOverFlow  (0) 2024.06.28
자바의 메모리 구조  (0) 2024.06.28
쓰레드의 동기화  (0) 2024.06.26