이번 포스트에서는 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());
}
}