Java

[Java]While문 & Switch문 함께 쓸 때 주의점

Woonys 2022. 5. 23. 21:07
반응형

switch 문에서의 break

원래 while문에서 break를 사용하면 while문을 종료시키고 빠져나올 수 있다. 그런데 만약 while문 안에 switch문을 쓴 뒤, switch문에서 바깥을 감싸고 있는 while문까지 종료시켜야 할 경우라면 어떨까? 그냥 생각해보면 switch문의 특정 case에서 break넣으면 되는 거 아냐?라고 생각할 수 있는데, 이렇게 하면 문제가 발생한다. switch 문에서의 break는 case를 빠져나가는 용도로만 쓰이지 while을 종료시키지 않기 때문. 그렇다고 break를 두 번 쓰려니 이미 위의 break에서 switch문을 빠져나왔으니 아래 break로 가지 않는다. 어떻게 해야 할까?

 

결론부터 말하면, while문을 종료시키려면 while문에서의 조건을 false로 바꾸는 로직을 해당 case에 추가해줘야 한다.

 

아래 예제는 <이것이 자바다> 확인문제 7번 문제인 ATM기 구현 예제이다.

 

while문과 Scaneer를 이용해서 키보드로부터 입력된 데이터로 예금, 출금, 조회, 종료 기능을 제공하는 코드를 작성해보세요.

 

밑의 while문을 보면 input을 넣어 종료시키기 전까지는 반복문을 계속 돌면서 예금되어 있는 값을 들고 있어야 하고 종료시켰을 때는 아예 while까지 끝나야 한다. 먼저 이전에 짠 케이스를 보자.

// 잘못 짠 케이스
package Ch4.exercise;

import java.util.Scanner;

public class ex07 {
    public static void main(String[] args) {
        boolean run = true;

        int balance = 0;

        Scanner scanner = new Scanner(System.in);
        while (run) {
            System.out.println("----------------------------------");
            System.out.println("1. 예금 | 2. 출금 | 3. 잔고 | 4. 종료");
            System.out.println("----------------------------------");
            System.out.println("선택> ");
            int inputNum = scanner.nextInt();

            switch (inputNum) {
                case 1:
                    System.out.println("예금액> ");
                    int deposit = scanner.nextInt();
                    balance += deposit;
                    break;
                case 2:
                    System.out.println("출금액> ");
                    int withdraw = scanner.nextInt();
                    if (balance - withdraw < 0) {
                        System.out.println("잔액이 부족해 출금할 수 없습니다.");
                    } else {
                        balance -= withdraw;
                    }
                    break;
                case 3:
                    System.out.println("잔고> " + balance);
                    break;
                case 4:
                    System.out.println("프로그램 종료");
                    break Outter;
            }
        }

     }
  }
}

 

위의 switch문에서 case 4가 프로그램을 종료하는 case에 해당한다. 이때, 해당 switch만이 아니라 바깥 while문도 종료되어야 한다. 혹시나 싶어 Outter를 써봤지만 전혀 먹히지 않는다. 애당초 while의 조건에 해당하는 run 변수가 바뀌지 않으니 while문이 계속 돌게 되는 상황이 발생한다. 이를 case 4에서 break 전에 변수 run을 false로 바꿈으로써 해결한다.

 

// 수정안

package Ch4.exercise;

import java.util.Scanner;

public class ex07 {
    public static void main(String[] args) {
        boolean run = true;

        int balance = 0;

        while (run) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("----------------------------------");
            System.out.println("1. 예금 | 2. 출금 | 3. 잔고 | 4. 종료");
            System.out.println("----------------------------------");
            System.out.println("선택> ");

            int inputNum = scanner.nextInt();
            switch (inputNum) {
                case 1:
                    System.out.println("예금액> ");
                    int deposit = scanner.nextInt();
                    balance += deposit;
                    break;
                case 2:
                    System.out.println("출금액> ");
                    int withdraw = scanner.nextInt();
                    if (balance - withdraw < 0) {
                        System.out.println("잔액이 부족해 출금할 수 없습니다.");
                    } else {
                        balance -= withdraw;
                    }
                    break;
                case 3:
                    System.out.println("잔고> " + balance);
                    break;
                case 4:
                    System.out.println("프로그램 종료");
                    run = false;
                    break;
            }
        }
    }
}
반응형