farmeter / random

0 stars 0 forks source link

가볍게 살펴보는 Java 14 New Features #29

Open farmeter opened 4 years ago

farmeter commented 4 years ago

Oracle이 Java14를 발표한지도 몇달이 지났는데요.

신기능을 소개하는 몇가지 기사가 있어, 내용을 간단하게 정리했습니다. 12,13도 잘 모르는건 함정입니다

1. Switch

12, 13 버전에서 preview feature였던 신규 switch 표현식이 14에서 확정되었습니다.

기본적으로 람다식을 지원하며, Statement에서 Expression으로 바뀌면서 아래와 같이 리턴값을 받을 수 있게 되었습니다.

String result = switch (day) {
            case "M", "W", "F" -> "MWF";
            case "T", "TH", "S" -> "TTS";
            default -> {
                if(day.isEmpty())
                    yield "Please insert a valid day.";
                else
                    yield "Looks like a Sunday.";
            } 
        };

만약 return 사용 시 switch가 아닌 해당 메서드가 종료됩니다. 이를 위해 yield 키워드가 추가되었습니다.

2. Helpful NullPointerExceptions

가장 마음에 드는 feature 인데요.

a.b.c.i = 99; 와 같은 구문에서 NPE 발생 시, line number 뿐 아니라, 원인을 좀더 상세하게 보여 줍니다.

// before Java 14
Exception in thread "main" java.lang.NullPointerException at Prog.main(Prog.java:5)

// Java 14 Onwards
Exception in thread "main" java.lang.NullPointerException
: Cannot assign field "i" because "a" is null at Prog.main(Prog.java:5)

3. Records (Preview)

(preview 스펙은 --enable-preview 옵션을 사용해야 합니다.)

Record는 "데이터 클래스"이며 순수하게 데이터를 관리하는 특수한 종류의 클래스입니다. Entity 등을 사용할 때 유용할 것 으로 보입니다.

public class DataClass {
   private final String name;
   private final Integer age;

   public DataClass(String name, Integer age) {
      this.name = name;
      this.age = age;
   }

   public String getName() {
      return name;
   }
    ...
}

우리에게 익숙한 패턴 대신, 대신 이렇게 사용할 수 있습니다.

public record NewRecord(
   String name,
   Integer age
) {}

기존에 lombok으로 처리하던 속성들을 기본으로 가지고 있습니다.

4. Text Blocks (Preview)

multiline string을 손쉽게 쓰기 위해 Java 13에 preview로 추가된 기능인데요. 여전히 preview이지만, 몇가지 추가적인 기능이 14에 추가되었습니다.

String before = ""
            + "{\n "
            + "     \"id\":10,\n"
            + "     \"age\":20\n"
            + "}\n";

String after = """
    {
        "id":10,
        "age":20
    }
    """;
// before 와 after 는 같다.
String text1 = """
                line1
                line2 \s
                line3
                """; 

String text2 = "line1\nline2 \nline3\n"
// text1와 text2 는 같다.

기타

// before Java 14
if (obj instanceof Journaldev) {
  Journaldev jd = (Journaldev) obj;
  System.out.println(jd.getAuthor());
}

// Java 14 Onwards
if (obj instanceof Journaldev jd) {
  System.out.println(jd.getAuthor());
}

참조

https://www.journaldev.com/37273/java-14-features https://www.techgeeknext.com/java/java14-features http://www.itworld.co.kr/news/135746 https://multifrontgarden.tistory.com/265