자바 기본 스위치 문법 학습 (Day05)

스위치의 세 가지 사용 방식

  1. 표준 스위치 구문 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는 퍼레이션 방지를 위해 필수.
  1. 화살표 기반 스위치 (->) 기존의 break를 줄이고 코드 가독성을 높입니다:
switch (식) {
    case 값1 -> 명령어 블록1;
    case 값2 -> 명령어 블록2;
    ...
    case 값N -> 명령어 블록N;
    default -> 명령어 블록N+1;
}

이 방식은 break 없이도 단일 블록만 실행되며, 퍼레이션을 방지합니다. 단, :->를 혼용할 수 없습니다.

다중 조건 처리도 가능:

switch (식) {
    case 값1, 값2, 값3 -> 명령어 블록;
    ...
    default -> 명령어 블록;
}

  1. 반환값을 가지는 스위치 (yield) 스위치를 표현식으로 사용해 반환값을 얻을 수 있습니다:
int 요일 = 2;
String 결과 = switch (요일) {
    case 1 -> "월요일";
    case 2 -> "화요일";
    case 3 -> "수요일";
    case 4 -> "목요일";
    case 5 -> "금요일";
    case 6 -> "토요일";
    default -> "일요일";
};
System.out.println(결과);

yield는 값을 반환하며, 스위치 표현식의 결과로 작용합니다. 모든 분기에서 반드시 yield를 사용해야 하며, 전체 구문 끝에 세미콜론이 필요합니다.

if와 스위치의 비교

  1. 판단 방식
  • if: 관계 연산자의 진리값에 따라 실행.
  • switch: 표현식과 케이스 값의 정확한 일치 여부 기반.
  1. 실행 흐름
  • if: 위에서 아래로 순차 평가, 첫 번째 참인 조건 실행 후 종료.
  • switch: 일치하는 케이스 찾고, break 또는 종료까지 계속 실행.
  1. 적합한 상황
  • 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는 단일 변수의 여러 고정 값에 대해 효율적.
  • 상황에 따라 적절한 선택이 중요.

태그: java switch statement conditional logic yield keyword arrow syntax

6월 1일 19:54에 게시됨