CodeGym/Java Blog/무작위의/자바 스위치 문
John Squirrels
레벨 41
San Francisco

자바 스위치 문

무작위의 그룹에 게시되었습니다
회원

Java Switch에 대한 약간의 이론

당신이 갈림길에 멈춰 선 기사라고 상상해 보세요. 왼쪽으로 가면 말을 잃게 됩니다. 오른쪽으로 가면 지식을 얻을 수 있습니다. 이 상황을 코드로 어떻게 표현할까요? 이러한 결정을 내리기 위해 if-thenif-then-else와 같은 구성을 사용한다는 것을 이미 알고 계실 것입니다 .
if (turn_left) {
    System.out.println("You will lose your horse");
}
if (turn_right) {
    System.out.println("You will gain knowledge");
}
else
    System.out.println("So you're just going to stand there?");
그러나 길이 둘로 갈라지는 것이 아니라 열 갈래로 갈라진다면? "완전히 오른쪽으로", "약간 왼쪽으로", "조금 더 왼쪽으로" 등 총 10개의 가능한 도로가 있습니까? 이 버전에서 "if-then-else " 코드가 어떻게 커질지 상상해 보세요!
if (option1)
{}
else if (option2)
{}else if (optionN) ...
도로에 10방향 분기점이 있다고 가정합니다(여기서 옵션의 수가 한정되어 있다는 것이 중요합니다). 이러한 상황을 위해 Java에는 switch 문이 있습니다.
switch (ExpressionForMakingAChoice) {
           case (Value1):
               Code1;
               break;
           case (Value2):
               Code2;
               break;
...
           case (ValueN):
               CodeN;
               break;
           default:
               CodeForDefaultChoice;
               break;
       }
이것이 진술이 작동하는 방식입니다.
  • ExpressionForMakingAChoice가 평가됩니다. 그런 다음 switch 문은 결과 값을 다음 ValueX와 비교합니다(나열된 순서대로).
  • ExpressionForMakingAChoice가 ValueX와 일치하면 콜론 다음의 코드가 실행됩니다.
  • break 문을 만나면 switch 문 외부로 제어가 이전됩니다.
  • ExpressionForMakingAChoice가 ValueX와 일치하지 않으면 제어가 CodeForDefaultCase로 전달됩니다.
중요 사항
  • switch 문에서 ExpressionForMakingAChoice의 유형은 다음 중 하나여야 합니다.

    • 바이트 , 짧은 , char , int .
    • Byte , Short , Character , Integer (기본 데이터 유형의 래퍼).
    • 문자열 .
    • 열거형 .
  • 기본 블록 선택 사항입니다. 이것이 없고 ExpressionForMakingAChoice가 어떤 ValueX와도 일치하지 않으면 어떤 작업도 실행되지 않습니다.
  • break 문 필요하지 않습니다. 없는 경우 코드는 break가 처음 나타날 때까지 또는 switch 문이 끝날 때까지 계속 실행됩니다(case 문에서 추가 비교 무시) .
  • 여러 선택에 대해 동일한 코드를 실행해야 하는 경우 여러 개의 연속적인 case 문을 지정하여 중복을 제거할 수 있습니다.

이제 Java에서 switch 문이 어떻게 사용되는지 살펴보겠습니다.

걱정하지 마세요. 이론은 끝났습니다. 다음 예를 보고 나면 모든 것이 훨씬 더 명확해질 것입니다. 글쎄, 시작하자. 태양계의 행성과 관련된 천문학의 예를 살펴보겠습니다. 최신 국제적 태도에 따라 우리는 명왕성을 제외했습니다(궤도 특성 때문에). 수성, 금성, 지구, 화성, 목성, 토성, 천왕성 및 해왕성과 같이 태양으로부터의 거리에 따라 행성이 배열되어 있음을 기억합니다. 행성의 서수(태양으로부터의 거리에 상대적인)를 취하고 행성 대기의 주요 구성 요소를 List <String> 로 반환하는 Java 메서드를 작성해 보겠습니다.. 일부 행성의 대기 구성이 비슷하다는 것을 기억할 것입니다. 따라서 금성과 화성은 주로 이산화탄소를 함유하고 있습니다. 목성과 토성의 대기는 수소와 헬륨으로 구성되어 있습니다. 천왕성과 해왕성은 마지막 가스 쌍에 메탄을 추가합니다. 우리의 기능은 다음과 같습니다.
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
            break;
        case 2:
        case 4: result.add("Carbon dioxide");
            break;
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
            break;
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
            break;
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
            break;
        default:
            break;
    }
    return result;
}
동일한 대기 구성을 가진 행성에 대해 동일한 코드를 사용하고 있음에 유의하십시오. 연속적인 case 문을 사용하여 이를 수행했습니다 . 고향 행성의 대기 구성을 얻으려면 인수로 3을 사용하여 메서드를 호출합니다.
getPlanetAtmosphere(3).
System.out.println(getPlanetAtmosphere(3)) returns ["Carbon dioxide", "Nitrogen", "Oxygen"].
break 실험: break 문을 모두 제거하면 어떻게 될까요? 한번 해봅시다:
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
        case 2:
        case 4: result.add("Carbon dioxide");
        case 3: result.add("Carbon dioxide");
            result.add("Nitrogen");
            result.add ("Oxygen");
        case 5:
        case 6: result.add("Hydrogen");
            result.add("Helium");
        case 7:
        case 8: result.add("Methane");
            result.add("Hydrogen");
            result.add("Helium");
        default:
    }
    return result;
}
System.out.println(getPlanetAtmosphere(3)) 의 결과를 인쇄하면 고향 행성이 살기에 적합하지 않다는 것을 알게 됩니다. 아니면? 스스로 판단하십시오 : [ "이산화탄소", "질소", "산소", "수소", "헬륨", "메탄", "수소", "헬륨"] . 왜 이런 일이 일어났습니까? 프로그램은 첫 번째 일치 후 switch 블록 이 끝날 때까지 모든 case 문을 실행합니다 .

break 문의 과도한 최적화

break 문과 사례를 다르게 배열하여 방법을 개선할 수 있습니다 .
public static List<String> getPlanetAtmosphere(int seqNumberFromSun) {
    List<String> result = new ArrayList<>();
    switch (seqNumberFromSun) {
        case 1: result.add("No atmosphere");
                break;
        case 3: result.add("Nitrogen");
                result.add ("Oxygen");
        case 2:
        case 4: result.add("Carbon dioxide");
                break;
        case 7:
        case 8: result.add("Methane");
        case 5:
        case 6: result.add("Hydrogen");
                result.add("Helium");
    }
     return result;
}
코드가 적은 것 같죠? 사례 진술 의 순서를 변경하고 재편성하여 총 진술 수를 줄였습니다 . 이제 각 유형의 가스가 단 한 줄의 코드로 목록에 추가됩니다. 마지막 예제에 제공된 코드는 작동 방식을 보여주기 위한 것입니다. 이런 방식으로 코드를 작성하는 것은 권장하지 않습니다. 그러한 Java 코드의 작성자(다른 프로그래머는 고사하고)가 이를 유지해야 하는 경우 해당 케이스 블록의 형성 뒤에 있는 논리와 switch 문에서 실행되는 코드를 재구성하는 것이 매우 어렵다는 것을 알게 될 것입니다 .

if와의 차이점

if 문과 switch 문이 외부적으로 유사하다는 점을 감안할 때 switch 문은 SPECIFIC VALUE를 기반으로 케이스 중 하나를 선택하는 반면 if 문은 부울 표현식을 가질 수 있다는 점을 잊지 마십시오 . 코드를 설계할 때 이 점을 염두에 두십시오.

결론

  • if 문으로 코드를 복잡하게 만들지 않으려면 두 개 이상의 분기에 대해 case 문을 사용하십시오 .
  • break 문 을 삽입하여 각 특정 값(case 문)에 대한 분기의 논리 블록을 완성하는 것을 잊지 마십시오 .
  • switch 문의 표현식은 Enum 또는 String 뿐만 아니라 일부 기본 유형일 수 있습니다.
  • 기본 블록을 기억하십시오 . 예상치 못한 값을 처리하는 데 사용하십시오.
  • 성능을 최적화하려면 가장 일반적인 값에 해당하는 코드 분기를 스위치 블록의 시작 부분으로 이동하십시오.
  • case 문 끝에 있는 break 문을 삭제하여 "최적화"에 몰두하지 마십시오 . 이러한 코드는 이해하기 어렵고 결과적으로 유지 관리하기 어렵습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다