도전 lv2 키오스크
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;
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();
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();
shoppingCartAddCancel(chooseChildMenu-1);
}
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(int idx) {
MenuItem menuItem = menu.getMenuItems().get(idx);
List<MenuItem> shoppingCart1 = shoppingCart.getShoppingCartItems();
System.out.println(menuItem.toString());
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인 2. 취소");
int chooseShoppingCartMenu = io("번호를 선택해주세요 : ", 1, 2);
if (chooseShoppingCartMenu == 1) {
MenuItem shoppingCartItemTemp = new MenuItem(menuItem.getName(), menuItem.getPrice(),
menuItem.getExplanation(), 1);
shoppingCart.addShoppingCartItems(shoppingCartItemTemp);
// 장바구니에 같은 메뉴가 들어왔을 때 사용
for (int i = 0; i<shoppingCart1.size()-1; i++) {
for (int j = i+1; j<shoppingCart1.size(); j++) {
if (shoppingCart1.get(i).getName().equals(shoppingCart1.get(j).getName())) {
shoppingCart.removeShoppingCartItems(j);
shoppingCart1.get(i).setPrice();
shoppingCart1.get(i).setCount();
}
}
}
System.out.println(menuItem.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) {
showDiscountMenu();
int chooseDiscountMenu = io("번호를 선택해주세요 : ", 1, 4);
switch (chooseDiscountMenu) {
case 1-> sum*=0.9;
case 2-> sum*=0.95;
case 3-> sum*=0.97;
default-> sum*=1;
}
System.out.println("주문이 완료되었습니다. 금액은 W " + String.format("%.1f", sum) + " 입니다");
shoppingCart.clearShoppingCartItems();
} else {
System.out.println("메뉴판으로 되돌아갑니다");
}
return chooseOrderAndMenu;
} else {
System.out.println("진행중인 주문을 취소했습니다");
}
}
return 0;
}
public void showDiscountMenu() {
System.out.println("할인 정보를 입력해주세요.");
for (Discount discount: Discount.values()) {
System.out.println(discount.ordinal()+1 +". " + discount.getType() +" : " + discount.getDiscount());
}
}
}
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;
// for (MenuItem shoppingCartItem : shoppingCartItems) {
// System.out.println(shoppingCartItem.toString());
// sum += shoppingCartItem.getPrice();
// }
shoppingCartItems.forEach(item -> System.out.println(item.toString()));
sum = shoppingCartItems.stream().mapToDouble(MenuItem::getPrice).sum();
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();
}
}
Discount enum클래스
package com.example.kiosk;
public enum Discount {
PERSONOFNATIONALMERIT("10%","국가유공자"), ARMY("5%","군인"), STUDENT("3%","학생"), GENERALPERSON("0%","일반인");
private final String discount;
private final String type;
Discount (String discount, String type) {
this.discount=discount;
this.type=type;
}
public String getDiscount() {
return this.discount;
}
public String getType() {
return this.type;
}
}
마찬가지로 바뀐 클래스만 다시 올렸습니다.
오늘 도전 기능 다 해보고자 도전했다. 하지만 람다 & 스트림을 직접 코드에 활용을 하려고 보니 어떻게 활용해야 하지? 쉬운 람다 스트림만 해봤지 막상 이런 코드에 적용은 안 해본 것이였다. 그렇게 enum까지만 하고 제출하게 되었다. 그래도 어제 개선사항 부분들 Map으로 바꾸는 것 빼곤 다 적용하긴 했다. Map은 조금 많이 걸릴 것 같아서 나중에 해보기로 하고 마무리 짓고 과제를 제출했다. 도전 기능 다 해보고 싶었지만 아직 부족하다는 것을 느꼈다.