ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 알고리즘
  • 티스토리챌린지
  • 클래스
  • 프로그래머스
  • Unity
  • c#
  • 오블완
  • 함수
  • C
  • C++
  • 문자열
  • SQL
  • 언리얼
  • 파이썬
  • 백준
  • 포인터
  • 유니티
  • 그래픽스
  • string
  • 배열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/Java

[Java] switch문

2025. 2. 2. 17:27

변경 전과 후 특징 비교

변경 전)

  • C, C++에서 사용하는 형태의 Switch 형식을 따른다.
  • 불필요한 반복코드 존재한다.
  • 다수의 case와 break가 존재한다.
  • 개발자의 실수로 break를 빼먹을 경우 다음 분기로 넘어가게 됨.

변경 후)

  • Switch 내에서 라벨이 일치하는 경우, case -> A와 같은 형식으로 표현이 가능하다.
  • 단일 수행 또는 블록 수행이 가능하다.
  • Switch 블록 내에서 계산된 값을 반환하는 yeild라는 키워드가 생겼다.
  • 여러 조건을 쉼표로 구분하여 한 라인으로 처리할 수 있음.

테스트 클래스 정의

enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY; }

코드로 변경사항 살펴보기

간단한 코드 비교를 통해 새로워진 Switch의 가장 큰 변화부터 살펴보려고 한다. 먼저, 기존의 Switch 표현을 통해 요일에 따른 처리를 한다면 다음과 같은 코드를 작성할 수 있을 것이다.

static void  test(Day day){
        switch (day) {
            case MONDAY:
            case FRIDAY:
            case SUNDAY:
                System.out.println(6);
                break;
            case TUESDAY:
                System.out.println(7);
                break;
            case THURSDAY:
            case SATURDAY:
                System.out.println(8);
                break;
            case WEDNESDAY:
                System.out.println(9);
                break;
    }
}

MONDAY, FRIDAY SUNDAY는 동일한 처리를 하기 위해 연속적으로 위치해야하고 미관상으로도 좋지 않다. 또 전체적으로 case, break, System.out.prinln()이 반복된다는 것을 알 수 있다. 새로워진 Switch에서는 위와 같은 불편함이 해소되었다.

static void  test(Day day){
        switch (day) {
             case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
             case TUESDAY                -> System.out.println(7);
             case THURSDAY, SATURDAY     -> System.out.println(8);
             case WEDNESDAY              -> System.out.println(9);
    }
}

조건에 해당하는 라벨을 ,로 구분하여 한 줄에 쓸 수 있고, -> 화살표를 통해 처리할 코드를 작성할 수 있다. 새로운 Switch 표현을 사용해 이전 보다는 간결해 졌지만 여전히 System.out.println()이 반복되는 것을 알 수 있다. 이런 경우에는 다음과 같은 표현도 가능하다.

public void test(Day day) {
        System.out.println(
                switch (day) {
                    case MONDAY, FRIDAY, SUNDAY -> 6;
                    case TUESDAY                -> 7;
                    case THURSDAY, SATURDAY     -> 8;
                    case WEDNESDAY              -> 9;
        	});
	}

System.out.println() 인자에 Switch를 사용할 수 있다. 기존 Switch는 반환값이 없었는데, 새로운 Switch는 반환값을 갖는다. 따라서 다음과 같은 표현이 가능하다.

public void test(Day day) {
        int cnt = switch(day) {
            case MONDAY, FRIDAY, SUNDAY -> 6;
            case TUESDAY                -> 7;
            case THURSDAY, SATURDAY     -> 8;
            case WEDNESDAY              -> 9;
        };
    }

반환 yield

-> 표현 오른쪽에 오는 처리는 꼭 단일 수행이 아니어도 된다. 이때는 {} 블록을 만들고 그 안에 수행할 코드를 작성하면된다. 또 Switch 표현에서 사용되는 yield라는 키워드가 생겼다. 새로운 Switch 표현이 처음 나온 Java 12에서는 break value;와 같은 문법으로 해당 기능을 지원했으나 현재 Java 14에서는 yield로 변경되었다. yield는 쉽게 말게 함수의 return과 비슷하다고 할 수 있다. yield는 해당 Switch 블록에 특정 값을 Switch의 결과값으로 반환하는 것이다. 

public void test(Day day) {
        int cnt = switch (day) {
            case MONDAY -> 0;
            case TUESDAY -> 1; 
            case WEDNESDAY -> {
                int k = day.toString().length();
                int result = k+5;
		yield result;
                //break result; <----- java 12 Switch Expression
            }
            default -> 0;
        };
}

yield 키워드는 항상 Switch 블록 내부에서만 사용된다.

public void test(Day day) {
        int cnt = switch (day) {
            case MONDAY -> 0;
            case TUESDAY -> yield 1; // error! yield는 block 안에서만 유효다
            case WEDNESDAY -> { yield 2;} // ok
            default -> 0;
        }
}

default

Switch의 반환값이 따로 필요하지 않은 경우나, case가 Switch로 들어오는 모든 인자를 커버하는 경우에는 default 항목을 따로 넣어주지 않아도 된다. 하지만 그렇지 않은 경우에는 default -> { your code; }를 꼭 작성해야 한다. 위 두 가지 경우가 아니면 에러가 발생한다.

 

https://velog.io/@nunddu/Java-Switch-Expression-in-Java-14

저작자표시 (새창열림)

'프로그래밍 언어 > Java' 카테고리의 다른 글

[Java] String Empty와 Blank 체크하기  (1) 2025.04.19
[Java] Collection Framework (자료구조 종류)  (0) 2025.02.09
[Java] Comparable과 Comparator : 비교를 위한 인터페이스  (0) 2024.10.22
[Java] Collections 클래스  (0) 2024.10.22
[Java] Generic 제네릭  (0) 2024.10.22
    '프로그래밍 언어/Java' 카테고리의 다른 글
    • [Java] String Empty와 Blank 체크하기
    • [Java] Collection Framework (자료구조 종류)
    • [Java] Comparable과 Comparator : 비교를 위한 인터페이스
    • [Java] Collections 클래스
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바