자바(SE)

[JDK] 버전별 특징 - JDK14

  • -

이번 포스트에서는 JDK14의 주요 특징에 대해 살펴보자. JDK 13을 건너뛰었는데 13의 중요한 두가지 특징은 preview였고 14에서 확정되었기 때문에 여기서 다뤄볼 계획이다.

 

문법적인 변화

 

Switch Expressions

JDK12에서 부터 시작한 Switch 표현식이 13을 거쳐서 14에서 확정되었다.

다음은 enum 형태의 Month를 이용해서 각 월에 해당하는 날짜 수를 반환하는 형태의 문장을 기존 switch로 작성한 예이다. 잘 동작하지만 정말 쓸데 없이 장황하다. 이 표현이 어떻게 바뀔 수 있는지 살펴보자.

enum Month {
    JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
}

@Test
public void test() {
    Month month = Month.JAN;
    int days = -1;
    switch (month) {
    case FEB:
        days = 28;
        break;
    case APR:
    case JUN:
    case SEP:
    case NOV:
        days = 30;
        break;
    default:
        days = 31;
    }
    System.out.println(days);
}

기존의 switch 표현식 대비 달라진 점은 다음과 같다. 내용이 어렵지는 않기 때문에 내용과 표현식으로만 정리한다.

  • 동일하게 처리되는 여러 조건을 쉼표로 구분하여 한 라인에서 처리 가능
  • 실행할 라인이 1줄인 경우 lambda 표현식을 이용한 탈출 처리
@Test
@DisplayName("동일하게 처리되는 조건의 한줄 처리 및 lambda 형태로 실행문 지정 가능 ")
public void switchTest1(){
    Months month = Months.FEB;
    int days = -1;
    switch(month){
        case FEB -> {
            System.out.println("2월 출력");
            days = 28;}
        case APR, JUN, SEP, NOV -> days=30;
        default -> days=31;
    }
    Assertions.assertEquals(days, 28);
}

 

  • 표현식 자체가  값을 반환 가능. 만약 block에서 반환해야 하는 경우는 yield 키워드 사용(yield는 block에서만 가능)
@Test
@DisplayName("표현식 자체에서 값 반환 가능")
public void switchTest2(){
    Months month = Months.NONE;
    int days = switch(month){
            case FEB -> 28;
            case APR, JUN, SEP, NOV -> 30;
            case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> {
                System.out.println("블록으로 처리하는 경우는 yield 필요");
                yield 31;
            }
            default -> throw new RuntimeException("이상한데?");
        };
    Assertions.assertEquals(days, 28);
}

 

Helpful NullPointerExceptions

기존에는 NullPointerException이 발생하면 특정 라인에서 발생했다는 정보 외에 어떤 객체에서 발생했는지가 표현되지 않았기 때문에 고민이 많이 필요했다.

@Test
public void test() {
   List<String> lines = Arrays.asList("Hello", null, "world");
   System.out.println(lines.stream().mapToInt(str->str.length()).reduce(0, Integer::sum));
}

위의 코드를 실행하면 JDK 13 이전에는 아래와 같은 오류를 확인할 수 있다.

Exception in thread "main" java.lang.NullPointerException
	at jdk10.JDKNewFeatures.lambda$0(JDKNewFeatures.java:19)

즉 파일 이름과 라인 번호 외에는 정보가 없었다. 

하지만 이제는 아래와 같이 상세한 정보가 제공되므로 정확히 어디에서 오류가 발생하는지 쉽게 알 수 있게 되었다.

java.lang.NullPointerException: Cannot invoke "String.length()" because "str" is null

 

'자바(SE)' 카테고리의 다른 글

[JDK] 버전별 특징 - JDK16  (0) 2023.05.23
[JDK] 버전별 특징 - JDK15  (0) 2023.05.23
[JDK] 버전별 특징 - JDK12  (0) 2023.05.22
[JDK] 버전별 특징 - JDK11  (0) 2023.05.22
[JDK] 버전별 특징 - JDK10  (0) 2023.05.22
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.