느리더라도 꾸준히

[Java기본]while문속의 switch문과 break; 본문

Java

[Java기본]while문속의 switch문과 break;

테디규 2022. 11. 3. 15:18

목표

while 문속의 switch를 사용하게 될때 발생하는 문제와 해결방안을 생각해봅시다.

본문

먼저 아래 코드를 봅시다.

public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("====연산자만 입력해주세요====");
        String operatorWord = input.next();

        while(true){
            switch (operatorWord){
                case "+":
                case "-":
                case "*":
                case "/":
                    break;
                default: {
                    System.out.println("연산자를 다시 입력해주세요");
                    operatorWord = input.next();
                    continue;
                }
            }
        }
    }

입력된 값이 연산자가 아니라면, 연산자를 넣어줄때까지 반복시키는 로직을 수행하려고 했습니다만, 무한루프가 발생하고 있습니다. 이유가 무엇일까요?

일반적으로 break; 문은 주로 반복문을 멈추는데 사용됩니다. 그러나 조건문인 switch문에서도 case를 빠져나갈때 break; 사용하게 됩니다. 그러므로 위 코드는 switch 문을 빠져나가느라 while을 탈출하지 못하고 있는 것입니다.

해결책1 - outerloop 사용하기

import java.util.Scanner;

public class switchTest {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("====연산자만 입력해주세요====");
        String operatorWord = input.next();
        outerloop:
        while(true){
            switch (operatorWord){
                case "+":
                case "-":
                case "*":
                case "/":
                    break outerloop;
                default: {
                    System.out.println("연산자를 다시 입력해주세요");
                    operatorWord = input.next();
                    continue;
                }
            }
        }
    }
}

반복문에 이름을 명명하여, break으로 해당 반복문을 빠져나오게 할수 있습니다.

해결책2 - boolean 변수 사용하기

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("====연산자만 입력해주세요====");
    String operatorWord = input.next();
    boolean isOperator = false;
    while(!isOperator){
        switch (operatorWord){
            case "+":
            case "-":
            case "*":
            case "/":
                isOperator=true;
                break;
            default: {
                System.out.println("연산자를 다시 입력해주세요");
                operatorWord = input.next();
                continue;
            }
        }
    }
}

boolean 값을 이용해 현재 상태를 나타내고, while문에게 현재 상태를 알려 루프를 탈출 할 수 있습니다.

Comments