JAVA
[Java] 도전 과제 Lv_1 키오스크
kimyongjun0129
2025. 4. 26. 19:31
요구사항
- ⬜ 바구니 생성 및 관리 기능
- ⬜ 사용자가 선택한 메뉴를 장바구니에 추가할 수 있는 기능을 제공합니다.
- ⬜ 장바구니는 메뉴명, 수량, 가격 정보를 저장하며, 항목을 동적으로 추가 및 조회할 수 있어야 합니다.
- ⬜ 사용자가 잘못된 선택을 했을 경우 예외를 처리합니다(예: 유효하지 않은 메뉴 번호 입력)
- ⬜ 장바구니 출력 및 금액 계산
- ⬜ 사용자가 결제를 시도하기 전에, 장바구니에 담긴 모든 메뉴와 총 금액을 출력합니다.
- ⬜ 출력 예시
- ⬜ 각 메뉴의 이름, 가격, 수량
- ⬜ 총 금액 합계
- ⬜ 장바구니 담기 기능
- ⬜ 메뉴를 클릭하면 장바구니에 추가할 지 물어보고, 입력값에 따라 “추가”, “취소” 처리합니다.
- ⬜ 장바구니에 담은 목록을 출력합니다.
- ⬜ 주문 기능
- ⬜ 장바구니에 담긴 모든 항목을 출력합니다.
- ⬜ 합산하여 총 금액을 계산하고, “주문하기”를 누르면 장바구니를 초기화합니다.
문제 풀이
Lv_1 ~ Lv_5에서 부분에 대한 설명은 생략하겠다.
Main
더보기
public class Main {
public static void main(String[] args) {
Kiosk kiosk = new Kiosk();
kiosk.start();
}
}
Kiosk
더보기
import java.util.InputMismatchException;
import java.util.Scanner;
public class Kiosk {
// 속성
private final Menu menu = new Menu();
private final ShoppingBascket shoppingBascket = new ShoppingBascket();
// 생성자
public Kiosk() {
menu.addMenu(new Burger("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거", MenuType.BURGER));
menu.addMenu(new Burger("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거", MenuType.BURGER));
menu.addMenu(new Burger("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거", MenuType.BURGER));
menu.addMenu(new Burger("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거", MenuType.BURGER));
menu.addMenu(new Cake("CheeseCake", 10.4, "내가 제일 좋아하는 치즈 케이크", MenuType.CAKE));
menu.addMenu(new Cake("chocolateCake", 5.4, "내가 제일 싫어하는 치즈 케이크", MenuType.CAKE));
}
// 기능
// 키오스크 동작
public void start() {
int mainMenuInput;
int menuInput;
int shoppingBascketInput;
do {
// 메인 메뉴를 보여준다.
menu.showMainMenu();
if (!shoppingBascket.getList().isEmpty()) shoppingBascket.showOrderMenu();
// 메인 메뉴에 대한 사용자의 입력을 받는다.
System.out.print("메뉴를 선택하세요 : ");
try {
mainMenuInput = userInput();
if (mainMenuInput == 0) {
System.out.println("종료합니다.");
return;
}
// 장바구니 메뉴가 보이지 않을 때, 전체 메뉴 갯수 보다 큰 수를 입력 시 예외 생성
if (shoppingBascket.getList().isEmpty() && mainMenuInput > menu.getTotalMenuCount()) throw new IndexOutOfBoundsException();
// 장바구니가 보일 때, 전체 메뉴 갯수 + 장바구니 메뉴 갯수(2) 보다 큰 수를 입력 시 예외 생성
if (mainMenuInput > menu.getTotalMenuCount() + 2) throw new IndexOutOfBoundsException();
// 장바구니 확인
if (mainMenuInput == menu.getTotalMenuCount() + 1) {
shoppingBascket.printTotalMenu();
System.out.println("1. 주문\t\t2. 메뉴판");
System.out.print("주문하시겠습니까? ");
int input = userInput();
if (!(input > 0 && input < 3)) throw new IndexOutOfBoundsException();
// 주문 완료
if (input == 1) {
int num = 1;
System.out.println("주문이 완료되었습니다. 금액은 w " + shoppingBascket.getSum() + " 입니다.\n");
shoppingBascket.resetSum();
shoppingBascket.resetshoppingBascket();
}
continue;
}
// 주문 취소
if (mainMenuInput == menu.getTotalMenuCount() + 2) {
System.out.println("주문이 취소되었습니다.\n");
shoppingBascket.resetshoppingBascket();
continue;
}
// 메뉴를 보여준다.
System.out.println();
menu.showMenu(mainMenuInput);
// 메뉴에 대한 사용자의 입력을 받는다.
System.out.print("메뉴를 선택하세요 : ");
menuInput = userInput();
if (menuInput == 0) {
System.out.println();
continue;
}
// 선택된 메뉴 보여주기
menu.showSelectedFood(mainMenuInput, menuInput);
// 장바구니에 추가할건지에 대한 사용자의 입력받기
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인\t\t2. 취소");
System.out.print("추가하시겠습니까? ");
shoppingBascketInput = userInput();
if (!(shoppingBascketInput > 0 && shoppingBascketInput < 3)) throw new IndexOutOfBoundsException();
// 장바구니에 추가하기
if (shoppingBascketInput == 1) {
shoppingBascket.addMenu(menu.getMenuItems(mainMenuInput, menuInput));
} else {
System.out.println("취소되었습니다.\n");
}
} catch (IndexOutOfBoundsException e) {
System.out.println("없는 메뉴입니다.\n");
} catch (InputMismatchException e) {
System.out.println("숫자를 입력해주세요.\n");
}
} while(true);
}
// 유저 메뉴 입력 받는 함수
private int userInput() {
Scanner scanner = new Scanner(System.in);
return scanner.nextInt();
}
}
- 유저로부터 입력 값이 메뉴 범위보다 더 큰 경우, 예외를 생성하여 일괄 처리하였다.
- 장바구니 기능을 사용하기 위해 ShoppingBascket 객체를 생성하고 활용하여 기능을 구현하였다.
Menu
더보기
import java.util.ArrayList;
import java.util.List;
public class Menu {
// 속성
private final List<List<MainMenu>> menuItems = new ArrayList<>();
// 생성자
public Menu() {
for(MenuType menuType : MenuType.values()) {
menuItems.add(new ArrayList<>());
}
}
// 메뉴 추가하는 기능
public void addMenu(MainMenu newFood) {
menuItems.get(newFood.getMenuType().getNum()-1).add(newFood);
}
// 메인 메뉴 보여주는 기능
public void showMainMenu() {
int num = 1;
System.out.println("[ MAIN MENU ]");
System.out.println("0. 종료\t\t | 종료");
for(MenuType type : MenuType.values()){
System.out.println(num++ + ". " + type.name());
}
}
// 메뉴 보여주는 기능
public void showMenu(int input) {
int num = 1;
System.out.println("[ SHAKESHACK MENU ]");
System.out.println("0. 뒤로가기\t\t");
for (MainMenu menuItem : menuItems.get(input-1)) {
System.out.println(num++ + ". "
+ menuItem.getFood_name() + "\t | w "
+ menuItem.getPrice() + " |\t"
+ menuItem.getIngredients());
}
}
// 메뉴 정보 제공
public void showSelectedFood(int mainMenuInput, int menuInput) {
System.out.println("선택한 메뉴 : "
+ menuItems.get(mainMenuInput-1).get(menuInput-1).getFood_name() + "\t | w "
+ menuItems.get(mainMenuInput-1).get(menuInput-1).getPrice() + " |\t"
+ menuItems.get(mainMenuInput-1).get(menuInput-1).getIngredients());
System.out.println();
}
public MainMenu getMenuItems(int num, int num1) {
return menuItems.get(num-1).get(num1-1);
}
public int getTotalMenuCount() {
return MenuType.values().length;
}
}
- Kiosk에서 사용되는 장바구니에 메뉴를 추가하기 위해, 특정 메뉴를 반환하는 getMenuItems() 메서드를 만들었다.
- Kiosk에서 메뉴 입력값에 대한 범위를 지정하는데 사용되는 getTotalMenuCount() 메서드를 만들었다.
MenuType
더보기
public enum MenuType {
BURGER(1),
DRINK(2),
DESSERT(3),
CAKE(4);
private final int num;
MenuType(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
ShoppingBascket
더보기
import java.util.ArrayList;
import java.util.List;
public class ShoppingBascket {
List<MainMenu> shoppingBascket = new ArrayList<>();
double sum = 0;
public void showOrderMenu() {
int num = MenuType.values().length;
System.out.println();
System.out.println("[ ORDER MENU ]");
System.out.println(++num + " Orders\t\t | 장바구니를 확인 후 주문합니다.");
System.out.println(++num + " Cancel\t\t | 진행중인 주문을 취소합니다.");
}
public void addMenu(MainMenu mainMenu) {
System.out.println(mainMenu.getFood_name() + "이 장바구니에 추가되었습니다.\n");
shoppingBascket.add(mainMenu);
sum += mainMenu.getPrice();
}
public List<MainMenu> getList() {
return shoppingBascket;
}
public void printTotalMenu() {
System.out.println("[ Orders ]");
for (MainMenu menu : shoppingBascket) {
System.out.println(menu.getFood_name() + " | " + menu.getPrice() + " | " + menu.getIngredients());
}
System.out.println("\n[ Total ]");
System.out.println("w " + sum + "\n");
}
public double getSum() {
return sum;
}
public void resetshoppingBascket () {
shoppingBascket.clear();
}
public void resetSum() {
sum = 0;
}
}
- 장바구니의 기능을 구현하는 클래스를 정의하였다.
- ShoppingBascket 클래스에서 배열에 저장할 때, 다형성을 이용해서 저장할 수 있게 해준다.
MainMenu
더보기
public abstract class MainMenu {
private final String food_name;
private final double price;
private final String ingredients;
private final MenuType menuType;
public MainMenu(String food_name, double price, String ingredients, MenuType menuType) {
this.food_name = food_name;
this.price = price;
this.ingredients = ingredients;
this.menuType = menuType;
}
public String getFood_name() {
return food_name;
}
public double getPrice() {
return price;
}
public String getIngredients() {
return ingredients;
}
public MenuType getMenuType() {
return menuType;
}
}
Burger
더보기
public class Burger extends MainMenu{
public Burger(String food_name, double price, String ingredients, MenuType menuType) {
super(food_name, price, ingredients, menuType);
}
}
Drink
더보기
public class Drink extends MainMenu{
public Drink(String food_name, double price, String ingredients, MenuType menuType) {
super(food_name, price, ingredients, menuType);
}
}
Dessert
더보기
public class Dessert extends MainMenu{
public Dessert(String food_name, double price, String ingredients, MenuType menuType) {
super(food_name, price, ingredients, menuType);
}
}
Cake
더보기
public class Cake extends MainMenu{
public Cake(String food_name, double price, String ingredients, MenuType menuType) {
super(food_name, price, ingredients, menuType);
}
}
트러블 슈팅
요구사항이 추가됨에 따라, Kiosk 클래스의 start() 메서드의 길이가 길어지면서, 깔끔하지 못한 예외처리, 중복된 if문 등으로 코드가 지저분해졌다. 이러한 과정을 최대한 보완하기 위해 예외를 생성하여 일괄처리하였고 중복 if문을 최대한 줄여 코드의 흐름을 위에서부터 자연스럽게 읽히도록 가독성을 높였다.