요구사항
- ⬜ 요구사항이 가지는 의도
- ⬜ 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
- ⬜ 햄버거 메뉴를 MenuItem 클래스와 List를 통해 관리합니다.
- ⬜ MenuItem 클래스 생성하기
- ⬜ 설명 : 개별 음식 항목을 관리하는 클래스입니다. 현재는 햄버거만 관리합니다.
- ⬜ 클래스는 이름, 가격, 설명 필드를 갖습니다.
- ⬜ main 함수에서 MenuItem 클래스를 활용하여 햄버거 메뉴를 출력합니다.
- ⬜ MenuItem 객체 생성을 통해 이름, 가격, 설명을 세팅합니다.
- ⬜ 키워드: new
- ⬜ List를 선언하여 여러 MenuItem을 추가합니다.
- ⬜ List<MenuItem> menuItems = new ArrayList<>();
- ⬜ 반복문을 활용해 menuItems를 탐색하면서 하나씩 접근합니다.
- ⬜ MenuItem 객체 생성을 통해 이름, 가격, 설명을 세팅합니다.
문제 풀이
Lv_1에서 진행한 부분에 대한 설명은 생략하겠다.
Main
더보기
package com.example.kiosk.Lv_2;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Kiosk kiosk = new Kiosk();
kiosk.addMenu("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거");
kiosk.addMenu("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거");
kiosk.addMenu("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거");
kiosk.addMenu("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거");
Scanner scanner = new Scanner(System.in);
int input = 1;
do {
kiosk.showMenu();
System.out.print("메뉴를 선택하세요 : ");
input = userInput(scanner);
if (kiosk.totalFoodCount() < input) {
System.out.println("음식이 없습니다.");
}
} while(input != 0);
}
public static int userInput(Scanner scanner) {
try {
return scanner.nextInt();
} catch(InputMismatchException e) {
System.out.println("올바른 값을 입력하세요.");
scanner.nextLine();
return -1;
}
}
}
- kiosk 객체에 있는 addMenu() 메서드를 통해 원하는 메뉴를 키오스크에 등록할 수 있다.
- Lv_1에서 showMenu() 메서드도 kiosk 클래스 안으로 넣었다.
- main에서는 키오스크를 사용하기만 한다. (완전 분리)
- 사용자의 Input을 userInput() 메서드로 분리하였다. → 가독성 향상
Kiosk
더보기
package com.example.kiosk.Lv_2;
import java.util.ArrayList;
import java.util.List;
public class Kiosk {
// 속성
List<MenuItem> foodList = new ArrayList<>();
// 생성자
// 기능
// 메뉴 추가하는 기능
public void addMenu(String foodName, double price, String ingredient) {
foodList.add(new MenuItem(foodName, price, ingredient));
}
// 메뉴 보여주는 기능
public void showMenu() {
int num = 1;
System.out.println(" [ SHAKESHACK MENU ]");
System.out.println("0. 종료\t\t\t\t | 종료");
for (MenuItem foodInfo : foodList) {
System.out.println(num++ + ". "
+ foodInfo.getFood_name() + "\t\t | w "
+ foodInfo.getPrice() + "\t "
+ foodInfo.getIngredients());
}
}
public double totalFoodCount() {
return (long) foodList.size();
}
}
- 메뉴를 추가하는 기능
- 메뉴를 보여주는 기능
- 총 음식 갯수를 반환하는 기능
MenuItem
더보기
package com.example.kiosk.Lv_2;
public class MenuItem {
private String food_name;
private double price;
private String ingredients;
public MenuItem(String food_name, double price, String ingredients) {
this.food_name = food_name;
this.price = price;
this.ingredients = ingredients;
}
public String getFood_name() {
return food_name;
}
public double getPrice() {
return price;
}
public String getIngredients() {
return ingredients;
}
}
- 키오스크에서 등록될 메뉴의 속성을 관리하는 클래스이다.
트러블 슈팅
다음 코드는 위 Main 클래스의 코드 중 일부분을 수정해서 가져온 코드이다.
public static int userInput(Scanner scanner) {
try {
return scanner.nextInt();
} catch(RuntimeException e) {
System.out.println("올바른 값을 입력하세요.");
scanner.nextLine();
return -1;
}
}
예외처리를 RuntimeException으로 한 번에 묶어서 처리를 진행하였다. 이는 안티 패턴이다. 그 이유는 다음과 같다.
- RuntimeException은 언체크 예외의 상위 클래스이다. 따라서 RuntimeException을 상속받는 다른 세밀한 객체들에 대한 예외가 터지면, RuntimeException으로 처리가 된다. → 이는 어떤 예외인지 분명하게 알 수 없게 만든다.
따라서 다음과 같이 코드를 수정하였다.
public static int userInput(Scanner scanner) {
try {
return scanner.nextInt();
} catch(InputMismatchException e) {
System.out.println("올바른 값을 입력하세요.");
scanner.nextLine();
return -1;
}
}
- InputMismatchException : Scanner 클래스를 사용할 때 입력된 데이터의 타입이 예상한 타입과 일치하지 않을 경우 발생한다.
'JAVA' 카테고리의 다른 글
[Java] Lv_4 & 5 키오스크 문제 (0) | 2025.04.25 |
---|---|
[Java] Lv_3 키오스크 (0) | 2025.04.24 |
[Java] Lv_1 키오스크 (0) | 2025.04.24 |
[Java] 예외 처리 (0) | 2025.04.23 |
[Java] Lv_3 계산기 문제 (0) | 2025.04.22 |