스위치의 세 가지 사용 방식
- 표준 스위치 구문 1.1 문법 구조
switch (식) {
case 값1:
명령어 블록1;
break;
case 값2:
명령어 블록2;
break;
...
case 값N:
명령어 블록N;
break;
default:
명령어 블록N+1;
}
스위치는 표현식의 값을 계산한 후 각 케이스 값과 비교합니다. 일치하는 경우 해당 블록을 실행하고, break를 만나거나 스위치 종료 시까지 진행됩니다. 매칭되지 않으면 default 블록이 실행되며, default가 없으면 아무런 동작도 하지 않습니다.
다중 케이스 결합도 가능합니다:
switch (식) {
case 값1:
case 값2:
case 값3:
명령어 블록;
break;
...
default:
명령어 블록;
}
1.2 케이스 퍼레이션 (직통 현상)
break가 누락된 경우, 다음 케이스로 자동 전이됩니다. 예시:
int 요일 = 2;
switch (요일) {
case 1: System.out.println("월요일");
case 2: System.out.println("화요일");
case 3: System.out.println("수요일");
case 4: System.out.println("목요일");
case 5: System.out.println("금요일");
case 6: System.out.println("토요일");
default: System.out.println("일요일");
}
결과: "화요일", "수요일", ..., "일요일" 모두 출력됨.
1.3 주의사항
- 지원 데이터 타입:
byte,short,int,char,enum,String(JDK 7 이상), 그리고 포장 클래스. long,float,double는 불가능.default는 위치에 관계없이 작동하지만, 권장 위치는 마지막.- 모든
case값은 표현식과 같은 타입이어야 함. break는 퍼레이션 방지를 위해 필수.
- 화살표 기반 스위치 (->)
기존의
break를 줄이고 코드 가독성을 높입니다:
switch (식) {
case 값1 -> 명령어 블록1;
case 값2 -> 명령어 블록2;
...
case 값N -> 명령어 블록N;
default -> 명령어 블록N+1;
}
이 방식은 break 없이도 단일 블록만 실행되며, 퍼레이션을 방지합니다. 단, :와 ->를 혼용할 수 없습니다.
다중 조건 처리도 가능:
switch (식) {
case 값1, 값2, 값3 -> 명령어 블록;
...
default -> 명령어 블록;
}
- 반환값을 가지는 스위치 (yield) 스위치를 표현식으로 사용해 반환값을 얻을 수 있습니다:
int 요일 = 2;
String 결과 = switch (요일) {
case 1 -> "월요일";
case 2 -> "화요일";
case 3 -> "수요일";
case 4 -> "목요일";
case 5 -> "금요일";
case 6 -> "토요일";
default -> "일요일";
};
System.out.println(결과);
yield는 값을 반환하며, 스위치 표현식의 결과로 작용합니다. 모든 분기에서 반드시 yield를 사용해야 하며, 전체 구문 끝에 세미콜론이 필요합니다.
if와 스위치의 비교
- 판단 방식
if: 관계 연산자의 진리값에 따라 실행.switch: 표현식과 케이스 값의 정확한 일치 여부 기반.
- 실행 흐름
if: 위에서 아래로 순차 평가, 첫 번째 참인 조건 실행 후 종료.switch: 일치하는 케이스 찾고,break또는 종료까지 계속 실행.
- 적합한 상황
if: 복잡한 논리 연산 (&&,||,!) 및 범위 판단에 유리.switch: 고정된 값 집합(예: 요일, 등급)에 대해 효율적.
등급 판별 프로그램 예제 성적을 등급으로 변환하는 사례:
public static char 성적_등급(int 점수) {
char 결과 = 'E';
int 단계 = 점수 / 10; // 0~10 범위
switch (단계) {
case 10, 9 -> 결과 = 'A';
case 8 -> 결과 = 'B';
case 7 -> 결과 = 'C';
case 6 -> 결과 = 'D';
case 5, 4, 3, 2, 1, 0 -> 결과 = 'F';
default -> 결과 = 'E';
}
return 결과;
}
테스트:
System.out.println(성적_등급(95)); // 'A'
System.out.println(성적_등급(83)); // 'B'
System.out.println(성적_등급(50)); // 'F'
결론
if는 복잡한 조건과 범위 판단에 적합.switch는 단일 변수의 여러 고정 값에 대해 효율적.- 상황에 따라 적절한 선택이 중요.