• 티스토리 홈
  • 프로필사진
    알쓸개잡
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
알쓸개잡
  • 프로필사진
    알쓸개잡
    • 분류 전체보기 (92)
      • 스프링부트 (52)
      • AWS (5)
      • 쿠버네티스 (7)
      • 자바 (19)
      • 인프라 (0)
      • ETC (8)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      • 반응형
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • java switch expression - from jdk 14
        2023년 08월 20일
        • 알쓸개잡
        • 작성자
        • 2023.08.20.:20

        JDK 12 에서 preview 기능으로 새롭게 추가된 switch expression(표현식)이 jdk 14 에서 정식 릴리즈 되었습니다.

        이번 포스팅에서는 정식 릴리즈된 switch expression 에 대해서 소개와 사용 방법에 대해서 소개합니다.

        JDK14 에 정식 릴리즈된 switch expression 은 JEP 361 에서 제안되었습니다.

        기존의 switch 구문(statement) 뿐 아니라 하나의 표현식(expression) 으로써 switch 를 제공합니다.

         

        "case L ->" Labels

        switch label 이 일치하는 경우 label 오른쪽에 있는 코드만 실행되도록 하는 새로운 형태의 스위치 lable 입니다. "case L ->" 로 표현합니다. 아래 코드는 기존의 switch 구문(statement)을 나타냅니다.

        public enum City { SEOUL, NEWYORK, LONDON }
        
        // ...
        
        String countryName;
        City city = City.SEOUL;
        
        switch (city) {
            case SEOUL:
                countryName = "Korea";
                break;
            case NEWYORK:
                countryName = "America";
                break;
            case LONDON:
                countryName = "England";
                break;
            default:
                countryName = "unknown";
        }
        
        System.out.println(countryName);

        도시의 나라 이름을 countryName 변수에 할당하여 출력하는 기존의 switch 구문입니다. 기존의 switch 구문을 사용하는 대신에 countryName 을 리턴하는 switch expression(표현식) 을 사용하면 코드를 더욱 간결하고 효율적으로 개선할 수 있습니다.

        아래는 "case L ->" switch expression 을 사용한 코드입니다. 

        public enum City { SEOUL, NEWYORK, LONDON }
        ...
        
        City city = City.SEOUL;
        String countryName =
            switch (city) {
                case SEOUL -> "Korea";
                case NEWYORK -> "America";
                case LONDON -> "England";
                default -> "unknown";
            };
        System.out.println(countryName);

        기존의 코드와 비교해서 더욱 간결하면서도 break 문이 제거됨으로써 break 문의 누락 실수를 방지할 수도 있습니다. 위 switch 문은 statement 가 아닌 expression 임을 알아야 합니다. 그렇게 때문에 값을 리턴할 수도 있습니다.

         

        "case L ->" Labels 와 yield

        switch expression 에서 yield 는 값을 리턴하는 키워드 입니다.

        "case L ->" 문법에서 여러 문장을 사용하는 경우에는 해당 코드를 블록으로 묶고 yield 를 통해 리턴할 수 있습니다.

        public enum City { SEOUL, NEWYORK, LONDON }
        ...
        
        City city = City.SEOUL;
        String countryName =
        switch (city) {
            case SEOUL -> {
                System.out.println("Korea");
                yield "Korea";
            }
            case NEWYORK -> {
                System.out.println("America");
                yield "America";
            }
            case LONDON -> {
                System.out.println("England");
                yield "England";
            }
            default -> {
                System.out.println("unknown");
                yield "unknown";
            }
        };

         

        "case L:" Labels 와 yield

        "case L ->" 이 아닌 "case L:" 문법에서도 yield 키워드를 사용하여 값을 리턴할 수 있습니다.

        public enum City { SEOUL, NEWYORK, LONDON }
        ...
        
        City city = City.SEOUL;
        String countryName =
            switch (city) {
                case SEOUL: yield "Korea";
                case NEWYORK: yield "America";
                case LONDON: yield "England";
                default: yield "unknown";
            };
        System.out.println(countryName);

        yield 문을 사용하면 switch statement(구문) 와 switch expression(표현식) 을 쉽게 구분할 수 있습니다. switch expression 이 아닌 switch statement 는 break 문의 대상이 될 수 있습니다. 반대로 switch expression 은 반환 문의 대상이 될 수 있습니다.

         

        오라클 공식문서에서는 "case L:" 를 사용하는 것보다 "case L ->" expression 을 사용하는 것을 권장합니다. "case L:" 문법을 사용하는 경우 break 혹은 yield 문을 누락하는 실수가 발생할 소지가 있기 때문입니다.

         

        Exhaustiveness (완전성)

        switch문(statement)과 달리 switch표현식(expression) 은 가능한 모든 값에 대해 일치하는 switch label 이 있어야 합니다. 따라서 switch expression 에는 default 문이 필요합니다. 단 enum 타입과 같이 알려진 상수를 포함하는 switch expression 의 경우 default 문이 없을 때는 컴파일러에서 암묵적으로 default 문을 넣습니다.

         

        또한 값을 할당하는 switch expression 이 사용되는 경우에 switch expression 은 반드시 값을 리턴해야 합니다.

        String countryName =
            switch (city) {
                //java: incompatible types: bad type in switch expression
                //void cannot be converted to java.lang.String
                //컴파일 error 발생!!
                case SEOUL -> System.out.println("Korea");
                default -> "unknown";
            };
        
        ===========
        
        switch (city) {
            //java: not a statement
            //리턴된 값을 할당하는 부분이 없기 때문에 컴파일 error 발생!!
            case SEOUL -> "Korea";
            default -> "unknown";
        };
                    
        ===========            
        
        switch (city) {
            //ok
            case SEOUL -> System.out.println("Korea");
            default -> System.out.println("unknown");
        };

        switch expression에서 단일값(리턴값이 있는) 으로 평가되는 경우에는 break, continue 문을 사용하여 switch expression 을 건널 뛸 수 없습니다. 이 경우에는 예외로 처리를 해야 합니다.

        public enum City { SEOUL, NEWYORK, LONDON }
        ...
        
        for (City city : City.values()) {
            String countryName = switch (city) {
                case SEOUL -> "Korea";
                case LONDON -> "England";
                //java: illegal start of expression compile error!!!
                default -> continue;
            };
            System.out.println(countryName);
        }

         

        위 코드와 같이 loop 구문 안에서 사용되는 switch expression 은 continue 대신에 예외로 처리를 해야 합니다.

        public enum City { SEOUL, NEWYORK, LONDON }
        ...
        
        for (City city : City.values()) {
            try {
                String countryName =
                    switch (city) {
                        case SEOUL -> "Korea";
                        case LONDON -> "England";
                        default -> throw new RuntimeException("not processed, " + city);
                    };
                System.out.println(countryName);
            } catch (RuntimeException e) {
                System.out.println(e.getMessage());
            }
        }
        
        =====================================
        
        실행결과
        Korea
        not processed, NEWYORK
        England

         

        JDK 14 에 정식 릴리즈된 switch expression 에 대한 오라클 공식 문서 링크 남깁니다.

        이 글을 읽으시는 분에게 도움이 되었기를 바랍니다.

        저작자표시 비영리 변경금지 (새창열림)

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

        jdk pattern matching for switch  (0) 2023.08.26
        jdk pattern matching for instanceof  (0) 2023.08.26
        java Array vs ArrayList  (0) 2023.08.19
        java record 용법 - from jdk 14  (0) 2023.08.19
        CompletableFuture 를 알아보자  (0) 2023.08.06
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바