자바(SE)

[JDK] 버전별 특징 - JDK16

은서파 2023. 5. 23. 13:28

이번 포스트에서는 JDK16에 추가된 기능들에 대해 살펴보자.

 

문법적인 변화

 

record  클래스

record는 JDK 14에서 처음 소개되었는데 16에서 정식으로 사용할 수 있게 되었다.

record 클래스는 불변성의 데이터를 갖는 객체를 만들기 위해서 사용된다.

이전에는 이런 목적을 위해서 final 키워드를 사용했다. blank final을 초기화 하기 위해 생성자에서 초기화가 필요했고 getter가 필수적이다.

public class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

하지만 record가 적용되면 아래와 같이 간단히 처리할 수 있다.  record 클래스는 심지어 toString, hashCode, equals 메서드까지 내부적으로 override가 완료된 상태이다.

public record Person(String name, int age) {    }

@Test
public void recordTest(){
    Person person1 = new Person("hong", 12);
    Person person2 = new Person("hong", 12);
    System.out.println(person1);                 // Person[name=hong, age=12]
    Assertions.assertEquals(person1,person2);
}

 

Stream에 toList() 메서드 추가

기존에는 Stream의 동작 결과를 List로 모으기 위해서 Collectors.toList를 사용해야했지만 이제 Stream에 직접 toList()가 추가되었다.

@Test
@DisplayName("Stream에 toList 메서드 추가")
public void streamToList(){
    String [] strNums = {"1", "2", "3"};
    List<Integer> oldStyle = Arrays.stream(strNums)
                                   .map(Integer::parseInt).collect(Collectors.toList());
    List<Integer> newStyle = Arrays.stream(strNums)
                                   .map(Integer::parseInt).toList();
}

 

pattern matching for instanceof

instanceof의 사용 시 기존에는 형이 확정되면 명시적으로 형 변환 후 사용했지만 이제 형변환이 완료된 변수를 바로 선언해서 사용할 수 있다.

@Test
@DisplayName("instanceof의 결과가 true이면 바로 형변화 후 변수에 할당")
public void patternMatchingForInstanceOf(){
    Object obj = "Hello";

    if(obj instanceof String){
        String str = (String) obj;
        System.out.println(str.length());
    }
    if(obj instanceof String str){
        System.out.println(str.length());
    }
}