키오스크 도전 lv1 다듬기
package com.example.kiosk;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
private final ShoppingCart shoppingCart = new ShoppingCart();
private final List<Menu> listMenus = new ArrayList<>();
private final Scanner sc = new Scanner(System.in);
public Kiosk () {
listMenus.add(new Menu("Burgers"));
listMenus.add(new Menu("Drinks"));
listMenus.add(new Menu("Desserts"));
}
public void start() {
Menu menu;
while (true) {
System.out.println();
// 메인 메뉴 시작
System.out.println("[ MAIN MENU" + " ]");
for (int i = 0; i< listMenus.size(); i++) {
System.out.println(i+1+"." + " " +listMenus.get(i).getCategory());
}
System.out.println("0. 종료 | 종료");
System.out.println();
int chooseParentMenu = io("메뉴를 선택해주세요 : ",0,3);
if (chooseParentMenu == 0) {
System.out.println("프로그램을 종료합니다");
break;
} else {
menu = listMenus.get(chooseParentMenu - 1);
System.out.println("선택한 메인메뉴 : " + chooseParentMenu + ". " + menu.getCategory());
}
System.out.println();
// 부 메뉴 시작
System.out.println("[ " + menu.getCategory() + "MENU" + " ]");
menu.showMenuCategory();
System.out.println("0. 되돌아가기 | 되돌아가기");
System.out.println();
int chooseChildMenu = io("메뉴를 선택해주세요 : ",0,4);
if (chooseChildMenu == 0) {
System.out.println("되돌아갑니다");
continue;
} else {
System.out.println("선택한 " + menu.getCategory() + "메뉴 : " + chooseChildMenu + ". " + menu.getMenuItems().get(chooseChildMenu - 1).toString());
System.out.println();
System.out.println();
// 장바구니 추가 및 취소 기능
System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).toString());
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인 2. 취소");
int chooseShoppingCartMenu = io("번호를 선택해주세요 : ", 1, 2);
if (chooseShoppingCartMenu == 1) {
shoppingCart.addShoppingCart(menu.getMenuItems().get(chooseChildMenu - 1).toString());
System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).getName() + "이 장바구니에 추가되었습니다");
} else {
System.out.println("취소되었습니다");
}
}
// 카트 주문 및 취소 기능
if (!shoppingCart.getShoppingCart().isEmpty()) {
int chooseOrderMenu;
System.out.println();
System.out.println("[ ORDER MENU" + " ]");
System.out.println("4. Orders | 장바구니를 확인 후 주문합니다.\n 5. Cancel | 진행중인 주문을 취소합니다.");
chooseOrderMenu = io("메뉴를 선택해주세요 : ", 4, 5);
if (chooseOrderMenu == 4) {
System.out.println("[ Orders" + " ]");
double sum = 0;
for (int i = 0; i < shoppingCart.getShoppingCart().size(); i++) {
String[] findPrice = shoppingCart.getShoppingCart().get(i).split("\\|");
String[] findPrice1 = findPrice[1].split(" ");
double findPrice2 = Double.parseDouble(findPrice1[2]);
System.out.println(shoppingCart.getShoppingCart().get(i));
sum += findPrice2;
}
System.out.println();
System.out.println("[ Total" + " ]");
System.out.println("W " + sum);
System.out.println();
System.out.println("1. 주문 2. 메뉴판");
int chooseOrderAndMenu = io("번호를 선택해주세요 : ", 1, 2);
if (chooseOrderAndMenu == 1) {
System.out.println("주문이 완료되었습니다. 금액은 W " + sum + " 입니다");
shoppingCart.removeShoppingCart();
break;
} else {
System.out.println("메뉴판으로 되돌아갑니다");
}
} else {
System.out.println("진행중인 주문을 취소했습니다");
}
}
}
}
// 입출력 및 예외처리 메서드
public int io(String choose, int min,int max) {
while (true) {
try {
while (true) {
System.out.print(choose);
int input = sc.nextInt();
if (input>=min && input<=max) {
return input;
}else {
System.out.println("메뉴의 숫자에서만 골라주세요");
}
}
}catch (InputMismatchException e){
System.out.println("숫자만 써주세요");
sc.nextLine();
}
}
}
}
MenuItem 클래스에서 추가된 부분
@Override
public String toString() {
return String.format("%s| W %.1f | %s", this.name, this.price,this.explanation);
}
package com.example.kiosk;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
List<String> shoppingCart = new ArrayList<>();
String name;
int count;
int price;
public ShoppingCart() {
}
public void addShoppingCart(String menu) {
this.shoppingCart.add(menu);
}
public List<String> getShoppingCart() {
return this.shoppingCart;
}
public void removeShoppingCart() {
this.shoppingCart.clear();
}
}
나머지 클래스들은 변경한 부분이 없어서 따로 넣지 않았다.
결론만 말하자면 튜터님 도움 + Chat Gpt
toString 오버라이딩은 튜터님이 알려주셔서 어느 정도 아 이렇게 쓰는 거구나라는 것을 알았지만 try-catch문 부분은 너무 많이 쓰이고 절차지향적이라 새로 짜거나 기능과 클래스를 최대한 분리하면서 해야 될 것 같다고 하셨다. 그래도 try-catch문을 뺄 수 있을 것 같은데? 하다가 gpt에게 물어보게 되었다.
왜 어려웠을까 생각해보니 잘 안 풀리니까 스트레스를 받아 더 이해가 안 되어서 그런 것 같다. 막상 해보니 막 어렵진 않았다. 그리고 코드로 볼 때 엄청 길어서 난감했는데 이렇게 TIL에 쓰니까 참담하게 기네.. 이게 객체지향? 🙄 절차지향이다.. 솔직히 이건 개선해서 이정도지😂 그 전에는 뭐 말도 안 나오네,, 주석 처리를 하다 보니 메서드로 분리할 것들이 더 있는 것 같아서 내일 이어서 분리해봐야 할 것 같다.