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("올바른 값을 입력하세요.");
}
다음과 같이 코드를 짜면, 예외 처리가 실행되는 시점에서 메뉴가 무한으로 출력되는 버그가 생긴다. 그 이유는 잘못된 입력값이 버퍼에 남아있기 때문이다. 순서에 맞춰 확인해보자.
- 사용자가 "ㄱ" 입력 → scanner.nextInt() 실패 → 예외 catch된다.
- 예외 메시지 출력 : "올바른 값을 입력하세요."
- 버퍼에 아직 "ㄱ"이 남아있다.
- 루프 다시 돌면서 또 scanner.nextInt() → 또 실패 → 무한 반복이다.
do {
try {
showMenu();
System.out.print("메뉴를 선택하세요 : ");
input = scanner.nextInt();
} catch (RuntimeException e) {
System.out.println("올바른 값을 입력하세요.");
scanner.nextLine(); // 👉 잘못된 입력 제거
}
} while(input != 0);
따라서 scanner.nextLine();을 통해 버퍼를 한 번 비워주면 해결이 된다.👍