JAVA

[Java] Lv_1 키오스크

kimyongjun0129 2025. 4. 24. 15:30

 

요구사항

  • 요구사항이 가지는 의도
    • ⬜ 입력 처리와 간단한 흐름 제어를 복습합니다. (프로그래밍 검증**)**
    • ⬜ Scanner 활용법, 조건문, 반복문을 재확인하며 입력 데이터를 처리하는 방법 강화

  • ⬜ 햄버거 메뉴 출력 및 선택하기
    • ⬜ Scanner를 사용하여 여러 햄버거 메뉴를 출력합니다.
    • ⬜ 제시된 메뉴 중 입력받은 숫자에 따라 다른 로직을 실행하는 코드를 작성합니다.
    • ⬜ 반복문을 이용해서 특정 번호가 입력되면 프로그램을 종료합니다.
  • ⬜ Lv1을 구현하면 터미널에 이렇게 보여집니다.
[ SHAKESHACK MENU ]
1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger  | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 종료          | 종료
0 <- // 0을 입력

프로그램을 종료합니다.

 

 


 

 

문제 풀이

package com.example.kiosk.lv_1;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int input = 1;

        do {
            try {
                showMenu();
                System.out.print("메뉴를 선택하세요 : ");
                input = scanner.nextInt();
            } catch (RuntimeException e) {
                System.out.println("올바른 값을 입력하세요.");
                scanner.nextLine();
            }
        } while(input != 0);
    }

    private static void showMenu() {
        System.out.println(" [ SHAKESHACK MENU ]");
        System.out.println("1. ShackBurger\t\t | w 6.9\t 토마토, 양상추, 쉑소스가 토핑된 치즈버거");
        System.out.println("2. SmokeShack\t\t | w 8.9\t 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거");
        System.out.println("3. Cheeseburger\t\t | w 6.9\t 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거");
        System.out.println("4. Hamburger\t\t | w 5.4\t 비프패티를 기반으로 야채가 들어간 기본버거");
        System.out.println("0. 종료\t\t\t\t | 종료");
    }
}
  • 반복 출력되는 메뉴는 메서드로 만들어서 재사용성을 높였다. -> showMenu()
  • do~while문을 통해 우선 메뉴를 보여주고 입력을 받은 후, 값을 검증하게 하였다.
  • 입력을 숫자 이외의 값을 받으면, RuntimeException의 자식 객체인 InputMismatchException 예외가 발생한다. 상속의 다형성을 이용해서 RuntimeException을 예외 처리하여 그 자식 객체들을 한 번에 처리하도록 하였다.

 


 

 

트러블 슈팅

다음 코드는 위 전체 코드에서 일부분만 가져온 것이다.

try {
    showMenu();
    System.out.print("메뉴를 선택하세요 : ");
    input = scanner.nextInt();
} catch (RuntimeException e) {
    System.out.println("올바른 값을 입력하세요.");
}

다음과 같이 코드를 짜면, 예외 처리가 실행되는 시점에서 메뉴가 무한으로 출력되는 버그가 생긴다. 그 이유는 잘못된 입력값이 버퍼에 남아있기 때문이다. 순서에 맞춰 확인해보자.

  1. 사용자가 "ㄱ" 입력 → scanner.nextInt() 실패 → 예외 catch된다.
  2. 예외 메시지 출력 : "올바른 값을 입력하세요."
  3. 버퍼에 아직 "ㄱ"이 남아있다.
  4. 루프 다시 돌면서 또 scanner.nextInt() → 또 실패 → 무한 반복이다.

 

 

do {
    try {
        showMenu();
        System.out.print("메뉴를 선택하세요 : ");
        input = scanner.nextInt();
    } catch (RuntimeException e) {
        System.out.println("올바른 값을 입력하세요.");
        scanner.nextLine(); // 👉 잘못된 입력 제거
    }
} while(input != 0);

따라서 scanner.nextLine();을 통해 버퍼를 한 번 비워주면 해결이 된다.👍