도전 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 Scanner sc;
private final ShoppingCart shoppingCart;
private final List<Menu> Menulist;
private Menu menu;
private int chooseChildMenu;
public Kiosk () {
sc = new Scanner(System.in);
shoppingCart = new ShoppingCart();
Menulist = new ArrayList<>();
Menulist.add(new Menu("Burgers"));
Menulist.add(new Menu("Drinks"));
Menulist.add(new Menu("Desserts"));
}
public void start() {
while (true) {
System.out.println();
// 메인 메뉴 시작
System.out.println("[ MAIN MENU" + " ]");
for (int i = 0; i< Menulist.size(); i++) {
System.out.println(i+1+"." + " " +Menulist.get(i).getCategory());
}
System.out.println("0. 종료 | 종료");
System.out.println();
int chooseParentMenu = io("메뉴를 선택해주세요 : ",0,3);
if (chooseParentMenu == 0) {
System.out.println("프로그램을 종료합니다");
break;
} else {
menu = Menulist.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();
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();
shoppingCartAddCancel();
}
int s = shoppingCartOrderCancel();
if (s==1) {break;}
}
}
// 입출력 및 예외처리 메서드
private 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();
}
}
}
// 장바구니 추가 및 취소 기능 메서드
private void shoppingCartAddCancel() {
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) {
MenuItem shoppingCartItemTemp = new MenuItem(
menu.getMenuItems().get(chooseChildMenu - 1).getName(),
menu.getMenuItems().get(chooseChildMenu - 1).getPrice(),
menu.getMenuItems().get(chooseChildMenu - 1).getExplanation(),
1
);
shoppingCart.addShoppingCartItems(shoppingCartItemTemp);
// 장바구니에 같은 메뉴가 들어왔을 때 사용
for (int i = 0; i<shoppingCart.getShoppingCartItems().size()-1; i++) {
for (int j = i+1; j<shoppingCart.getShoppingCartItems().size(); j++) {
if (shoppingCart.getShoppingCartItems().get(i).getName().equals(shoppingCart.getShoppingCartItems().get(j).getName())) {
shoppingCart.removeShoppingCartItems(j);
shoppingCart.getShoppingCartItems().get(i).setPrice();
shoppingCart.getShoppingCartItems().get(i).setCount();
}
}
}
System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).getName() + "이 장바구니에 추가되었습니다");
} else {
System.out.println("취소되었습니다");
}
}
// 장바구니에 담긴 음식 주문 및 취소 기능 메서드
private int shoppingCartOrderCancel() {
if (!shoppingCart.getShoppingCartItems().isEmpty()) {
System.out.println();
System.out.println("[ ORDER MENU" + " ]");
System.out.println("4. Orders | 장바구니를 확인 후 주문합니다.\n5. Cancel | 진행중인 주문을 취소합니다.");
int chooseOrderMenu = io("메뉴를 선택해주세요 : ", 4, 5);
if (chooseOrderMenu == 4) {
System.out.println("[ Orders" + " ]");
double sum = shoppingCart.sumPriceShowShoppingCart();
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.clearShoppingCartItems();
} else {
System.out.println("메뉴판으로 되돌아갑니다");
}
return chooseOrderAndMenu;
} else {
System.out.println("진행중인 주문을 취소했습니다");
}
}
return 0;
}
}
package com.example.kiosk;
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
private final List<MenuItem> shoppingCartItems;
public ShoppingCart() {
shoppingCartItems = new ArrayList<>();
}
// 장바구니 내역 보여주고 합계 계산 메서드
public double sumPriceShowShoppingCart() {
double sum = 0;
for (MenuItem shoppingCartItem : shoppingCartItems) {
System.out.println(shoppingCartItem.toString());
sum += shoppingCartItem.getPrice();
}
return sum;
}
public List<MenuItem> getShoppingCartItems() {
return this.shoppingCartItems;
}
public void addShoppingCartItems(MenuItem menu) {
this.shoppingCartItems.add(menu);
}
public void removeShoppingCartItems(int idx) {
this.shoppingCartItems.remove(idx);
}
public void clearShoppingCartItems() {
this.shoppingCartItems.clear();
}
}
package com.example.kiosk;
public class MenuItem {
private final String name;
private double price;
private final String explanation;
private int count;
MenuItem(String name, double price, String explanation) {
this.name = name;
this.price = price;
this.explanation = explanation;
}
MenuItem(String name, double price, String explanation, int count) {
this.name = name;
this.price = price;
this.explanation = explanation;
this.count = count;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public void setPrice() {
this.price+=this.price;
}
public String getExplanation() {
return explanation;
}
public int getCount() {
return this.count;
}
public void setCount() {
this.count++;
}
@Override
public String toString() {
if (this.count == 0) {
return String.format("%s| W %.1f | %s", this.name, this.price,this.explanation);
}
return String.format("%s| W %.1f | %s x %d", this.name, this.price,this.explanation,this.count);
}
}
내 코드가 어떻게 작동하는 지는 알겠는데 그것이 정확히 왜? 이렇게 되는지 알고 코드를 짜고 싶어서 코드카타가 끝난 이후 생성자 부분이 이해될 때까지 들여다보고 그림으로 그리면서 하다가 이해를 했다. 이해를 못했다면 아마 오늘 제대로 된 코딩을 시작 못했을 수도 있겠다는 생각에 아찔했다.😂 그런 다음 집중이 잘 돼서 내 나름대로 만족할 만한 리팩토링을 하고 lv2로 넘어갔다. 오늘은 어제처럼 시간이 아깝지 않았다고 생각한 날인 것 같다. 😎👍 이제 친해졌는데 새로운 팀이라니.. 모두들 화이팅!