switch는 무엇을 위한 것인가
switch는 하나의 값을 고정된 옵션 목록과 비교하여 일치하는 분기를 실행합니다. 같은 변수를 서로 다른 상수들과 계속 비교하는 긴 if/else if 체인을 쓰고 있는 자신을 발견할 때, switch는 같은 내용을 더 명확하게 표현합니다.
이것은 컴파일 타임 상수와의 동등 비교만 수행합니다. 범위를 검사하거나 조건을 결합할 수는 없습니다. 그런 경우에는 if/else를 유지하세요.
고전적인 switch 문
전통적인 형식은 콜론이 붙은 case 레이블과 각 분기 뒤의 break를 사용합니다.
Java는 day를 평가하고, 일치하는 case로 점프하여 그 문장들을 실행하고, break가 switch를 빠져나옵니다. default 분기는 다른 어떤 것도 일치하지 않을 때 실행됩니다. else처럼 생각하세요. 이것은 선택 사항이지만, 예상치 못한 값이 조용히 빠져나가지 않도록 포함해 두는 것이 좋은 관행입니다.
break의 함정: 폴스루
이것은 단연코 가장 흔한 switch 버그입니다. break를 빠뜨리면 실행은 일치한 case의 끝에서 멈추지 않습니다. 다음 case로 흘러내려 가서(폴스루) break나 닫는 중괄호에 도달할 때까지 계속 실행됩니다.
Level 1만 나올 거라 기대할 수도 있지만, 이것은 세 줄을 모두 출력합니다. case 1에 break가 없기 때문에 제어가 곧장 case 2와 case 3으로 미끄러져 들어갑니다. 정말로 폴스루를 원하는 경우가 아니라면 항상 break를 추가하세요. 그리고 폴스루에 의존할 때는, 다음 독자가 의도된 것임을 알 수 있도록 주석을 남기세요.
case 그룹화
폴스루에는 정당하고 깔끔한 용도가 하나 있습니다. 여러 값이 하나의 블록을 공유하도록 case 레이블을 쌓는 것입니다. 레이블들 사이에 코드 없이 연달아 놓으세요.
여기서 'A', 'B', 'C'는 모두 같은 "Pass" 줄을 실행합니다. 이것이 "이 값들 중 어느 것이든 같은 일을 한다"고 말하는 의도된 방식입니다.
문자열에 대한 switch
숫자에만 국한되지 않습니다. Java 7부터 String으로 switch할 수 있으며, 메뉴 선택이나 명령어 이름에 안성맞춤입니다.
매칭은 대소문자를 구분합니다. "Stop"은 "stop"과 일치하지 않으므로, 입력의 대소문자가 달라질 수 있다면 먼저 정규화하세요(예: command.toLowerCase()). 또 하나의 함정: command가 null이면 switch가 NullPointerException을 던지므로, 거기에 도달하기 전에 null을 방어하세요.
최신 화살표 구문
더 새로운 Java(14 이상)는 폴스루 함정을 설계 차원에서 해결하는 화살표 형식 case label -> ...를 추가합니다. 각 화살표 case는 정확히 하나의 분기를 실행하고 결코 폴스루하지 않으므로, 잊어버릴 break가 없습니다.
레이블을 쌓는 대신 쉼표로 값을 그룹화하고(case 6, 7), break가 단 하나도 보이지 않는 점에 주목하세요. 여러 문장을 쓰려면 블록을 사용하세요: case 1 -> { ...; ... }. 새 코드에서는 이 형식을 선호하세요. 더 짧고 버그의 한 부류 전체를 없앱니다.
표현식으로서의 switch
화살표 형식은 값을 생성할 수도 있습니다. switch 표현식은 변수에 바로 대입할 수 있는 결과를 반환합니다. 임시 변수도, 각 분기에서 반복되는 대입도 없습니다.
switch (...) { ... } 전체가 days에 저장되는 숫자로 평가됩니다. 닫는 중괄호 뒤의 세미콜론에 유의하세요. 이것은 대입문의 일부입니다. switch 표현식은 완전(exhaustive) 해야 합니다(가능한 모든 값을 다뤄야 함). 그래서 여기에 default가 있는 것입니다. 분기가 값을 반환하기 전에 여러 문장이 필요하면, yield가 있는 블록을 사용하세요.
case 2 -> {
boolean leap = (year % 4 == 0);
yield leap ? 29 : 28;
}
yield는 화살표 블록이 자신의 값을 돌려주는 방식이며, 결과를 실어 나르는 break의 표현식 세계 버전입니다.
다음: for 반복문
switch는 여러 분기 중 하나를 고릅니다. 때로는 그 대신 하나의 블록을 여러 번 반복해야 합니다. for 반복문은 코드를 통제된 횟수만큼 실행하며(범위를 세거나 각 항목을 거치며), 그것이 다음 페이지입니다.
자주 묻는 질문
Java에서 if-else 대신 switch를 언제 써야 하나요?
하나의 값을 요일 번호, 메뉴 선택, enum 같은 고정된 상수 옵션 여러 개와 비교할 때 switch를 쓰세요. 긴 if/else if 체인보다 더 명확하게 읽히고, "이 알려진 값들 중에서 하나의 분기를 고른다"는 의도를 전달합니다. 조건이 범위(x > 10), 여러 변수, 또는 상수와의 단순 동등 비교가 아닌 무언가를 포함하면 if/else를 유지하세요.
Java switch 문에서 break가 왜 필요한가요?
고전적인 콜론 구문에서는 어떤 case가 일치하면, break나 switch의 끝에 도달할 때까지 실행이 다음 case들로 흘러내려 갑니다(폴스루). break가 이를 멈춥니다. 이를 빠뜨리는 것은 전형적인 버그입니다. case 1:에 일치했는데 실수로 case 2:, case 3: 등의 코드까지 실행하게 되는 거죠. 더 새로운 화살표 구문(case 1 -> ...)은 결코 폴스루하지 않으므로 break를 전혀 쓰지 않습니다.
Java switch 문이 문자열(String)에서 동작하나요?
네. Java 7부터 String으로 switch할 수 있고, int, char, byte, short, 그것들의 래퍼 타입, 그리고 enum 값으로도 switch할 수 있습니다. long, double, float, boolean으로는 switch할 수 없습니다. 문자열 매칭은 대소문자를 구분하므로 "Yes"와 "yes"는 서로 다른 case입니다.