2023. 10. 18. 23:27ㆍJava/project
필수 조건
1. 화면은 System.out.println() 메서드를 사용해서 심플하게 출력한다.
2. 메뉴 클래스와 주문 클래스를 사용하여 Java의 핵심 기능인 상속을 최대한 사용합니다.
코드
1. Main.java
package sparta.java.kiosk;
public class Main {
public static void main(String[] args) {
MainController mainMenu = new MainController();
mainMenu.show();
}
}
2. MainController.java
package sparta.java.kiosk;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class MainController {
private List<Item> buyItemOrder = new ArrayList<>();
private List<Item> icecreamMenu = new ArrayList<>();
private List<Item> icecreamCakeMenu = new ArrayList<>();
private List<Item> drinkMenu = new ArrayList<>();
private List<Item> dessertMenu = new ArrayList<>();
private static final int MENU_ICECREAM = 1;
private static final int MENU_ICECREAM_CAKE = 2;
private static final int MENU_DESSERT = 3;
private static final int MENU_DRINK = 4;
private static final int ORDER_MENU = 5;
private static final int CANCEL_MENU = 6;
private Order order; // Order 객체를 MainController에 추가
private Scanner sc = new Scanner(System.in);
public MainController() {
buyItemOrder = new ArrayList<>();
// name, price, description, id 순서
icecreamMenu.add(new Item("ice1", 8900, "remeber this", 1));
icecreamMenu.add(new Item("ice2", 12000, "malicious flavor", 2));
icecreamMenu.add(new Item("ice3", 18900, "sour flavor", 3));
icecreamCakeMenu.add(new Item("ppice", 11000, "try this",1));
icecreamCakeMenu.add(new Item("qqice", 14000, "yes",2));
icecreamCakeMenu.add(new Item("rrice", 17000, "delicious food",3));
drinkMenu.add(new Item("georgiaCoffee", 4000, "bad",1));
drinkMenu.add(new Item("cocacola", 3000, "good",2));
dessertMenu.add(new Item("dessert1", 4000, "description1",1));
dessertMenu.add(new Item("dessert2", 5000, "description2",2));
order = new Order(buyItemOrder);
}
void show() {
System.out.println();
System.out.println("Baskin Robbins 31에 오신걸 환영합니다.");
System.out.println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.");
System.out.println(" [Menu]");
System.out.println("1. Icecream Menu | Icecream Description");
System.out.println("2. IcecreamCake Menu | Icecream Cake Description");
System.out.println("3. DessertMenu | Dessert Description");
System.out.println("4. Drink Menu | Drink Description");
System.out.println();
System.out.println(" [Order]");
System.out.println("5. Order | 장비구니를 확인 후 주문합니다.");
System.out.println("6. Cancel | 진행중인 주문을 취소합니다.");
System.out.println();
menuSelect();
}
public void menuSelect() {
String input = sc.next(); // 문자열로 읽기
try {
int choice = Integer.parseInt(input); // 문자열을 정수로 변환
switch (choice) {
case MENU_ICECREAM:
showMenu(icecreamMenu);
break;
case MENU_ICECREAM_CAKE:
showMenu(icecreamCakeMenu);
break;
case MENU_DESSERT:
showMenu(dessertMenu);
break;
case MENU_DRINK:
showMenu(drinkMenu);
break;
case ORDER_MENU:
if (buyItemOrder.isEmpty()) {
// 해당 조건문은 주문을 한 내역이 없는데 주문을 누른 경우
// 즉 리스트에 값이 없는데 입력한 경우입니다.
System.out.println("고객님은 주문하신 내역이 없습니다! 다시 이용해주세요!");
break;
}/*else {
System.out.println("buyItemOrder isTrue : "+buyItemOrder.get(0).getName());
}*/
order.showOrder(this);
break;
case CANCEL_MENU:
if (buyItemOrder.isEmpty()) {
// 해당 조건문은 주문을 한 내역이 없는데 취소를 누른 경우
// 즉 리스트에 값이 없는데 입력한 경우입니다.
System.out.println("고객님은 주문하신 내역이 없습니다! 다시 이용해주세요!");
break;
}
order.cancel(this);
break;
default:
System.out.println("해당 메뉴판에 없는 번호입니다.");
break;
}
} catch (NumberFormatException e) {
System.out.println("잘못된 입력입니다. 다시 시도해주세요.");
}
}
private void showMenu(List<Item> menu) {
System.out.println("========tmp=showMenu=====");
// 해당 메서드는 menu
menu.forEach((menuItem) -> {
System.out.println(menuItem.getId() + ". " + menuItem.getName() + " | " + menuItem.getDescription());
});
int test1 = sc.nextInt();
if (test1 <= 0 || test1 > menu.size()) {
System.out.println("잘못된 입력입니다. 다시 시도해주세요");
} else {
MenuItem selectedItem = menu.get(test1 - 1);
if (selectedItem instanceof Item) {
buyItemOrder.add((Item) selectedItem);
}
orderItem(selectedItem);
}
}
private void orderItem(MenuItem item) {
System.out.println("========tmp=BuyItem=====");
System.out.println(item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인 2. 취소");
int test = sc.nextInt();
switch (test) {
case 1:
//order.addItem(item);
System.out.println(item.getName() + "가 장바구니에 추가되었습니다.\n");
show();
break;
case 2:
show();
break;
default:
System.out.println("잘못된 입력입니다. 다시 시도해주세요.");
}
}
}
3. Order.java
package sparta.java.kiosk;
import java.util.List;
import java.util.Scanner;
public class Order {
private int number = 1;
private List<Item> buyItemOrder;
private Scanner sc = new Scanner(System.in);
public Order(List<Item> buyItemOrder) {
this.buyItemOrder = buyItemOrder; // MainController에서 전달받은 buyItemOrder를 사용
}
public void showOrder(MainController mainMenu) {
int totalPrice = buyItemOrder.stream()
.mapToInt(Item::getPrice)
.sum();
System.out.println("아래와 같이 주문하시겠습니까?\n");
System.out.println("[Orders]");
buyItemOrder.forEach((buyItem) ->
System.out.println(buyItem.getName() + " | " + buyItem.getPrice() + " | " + buyItem.getDescription())
);
System.out.println("[Total]");
System.out.println("W " + totalPrice);
System.out.println();
buyItem(mainMenu);
}
public void buyItem(MainController mainMenu) {
System.out.println("1. 주문 | 2. 메뉴판");
switch(sc.nextInt()) {
case 1:
System.out.println("주문이 완료되었습니다!");
System.out.println("대기번호는 ["+number+"]번입니다.");
number++;
buyItemOrder.clear();
/*if(buyItemOrder.isEmpty()) {
System.out.println("buyItemOrder.isEmpty() : true");
}*/
// 해당 고객이 주문한 내역을 지웁니다.
System.out.println("3초후 메뉴판으로 돌아갑니다.");
try {
Thread.sleep(3000); // 3초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
mainMenu.show();
break;
case 2:
mainMenu.show();
break;
default:
System.out.println("잘못 입력하셨습니다. 다시 이용해주세요");
break;
}
}
public void cancel(MainController mainMenu) {
System.out.println("진행하던 주문을 취소하겠습니까?");
System.out.println("1.확인 2.취소");
int check = sc.nextInt();
switch(check) {
case 1:
System.out.println("진행하던 주문이 취소되었습니다.");
buyItemOrder.clear();
// 리스트에 있는 모든 요소를 지웁니다.
mainMenu.show();
break;
case 2 :
break;
default :
break;
}
}
}
4. Menu.java
package sparta.java.kiosk;
public class Menu {
private String name;
private String description;
public Menu() {
}
public Menu(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
// Getter 및 Setter 메서드, 기타 메서드는 필요에 따라 추가
}
5. Item.java
package sparta.java.kiosk;
public class Item extends Menu implements MenuItem{
private int price;
private int id;
public Item(String name, int price, String description, int id) {
super(name, description);
this.price = price;
this.id = id;
}
public Item(String name, int price, String description) {
super(name, description);
this.price = price;
}
public int getPrice() {
return this.price;
}
public int getId() {
return this.id;
}
}
6. 출력문
/*
[=================Output===================]
Baskin Robbins 31에 오신걸 환영합니다.
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[Menu]
1. Icecream Menu | Icecream Description
2. IcecreamCake Menu | Icecream Cake Description
3. DessertMenu | Dessert Description
4. Drink Menu | Drink Description
[Order]
5. Order | 장비구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
1 // 사용자 입력
========tmp=showMenu=====
1. ice1 | remeber this
2. ice2 | malicious flavor
3. ice3 | sour flavor
1 // 사용자 입력
========tmp=BuyItem=====
ice1 | W 8900 | remeber this
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인 2. 취소
1 // 사용자 입력
ice1가 장바구니에 추가되었습니다.
Baskin Robbins 31에 오신걸 환영합니다.
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[Menu]
1. Icecream Menu | Icecream Description
2. IcecreamCake Menu | Icecream Cake Description
3. DessertMenu | Dessert Description
4. Drink Menu | Drink Description
[Order]
5. Order | 장비구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
5 // 사용자 입력
아래와 같이 주문하시겠습니까?
[Orders]
ice1 | 8900 | remeber this
[Total]
W 8900
1. 주문 | 2. 메뉴판
1 // 사용자 입력
주문이 완료되었습니다!
대기번호는 [1]번입니다.
3초후 메뉴판으로 돌아갑니다.
Baskin Robbins 31에 오신걸 환영합니다.
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[Menu]
1. Icecream Menu | Icecream Description
2. IcecreamCake Menu | Icecream Cake Description
3. DessertMenu | Dessert Description
4. Drink Menu | Drink Description
[Order]
5. Order | 장비구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
5 // 사용자 입력
고객님은 주문하신 내역이 없습니다! 다시 이용해주세요!
[=================Output END==============]
*/
내일 할일
1. 주문 개수 기능 추가
- 장바구니에 똑같은 상품이 담기면 주문 화면에서 상품 개수가 출력되도록 합니다.
2. 상품 옵션 기능 추가
- 상품에 옵션을 선택 후 장바구니에 추가 할 수 있게 세분화합니다.
3. 총판매금액 조회 기능 추가
- 구매가 완료될 때마다 총 판매 금액을 누적해 줍니다.
- 숨겨진 기능으로 0번 입력 시 총판매금액을 출력합니다.
4. 총판매상품 목록 조회 기능 추가
- 구매가 완료될 때마다 판매 상품 목록을 저장해 줍니다.
- 숨겨진 기능으로 0번 입력 시 총판매 상품 목록을 출력합니다.
아쉬웠 점
1.List <Item> buyItemOrder = new ArrayList <>();
MainController.java와 Order.java에서 buyItemOrder의 자원 공유 문제에서
시간이 많이 걸렸다...
public class MainController {
// 수많은 코드들..
public MainController() {
buyItemOrder = new ArrayList<>();
// 수많은 코드들...
order = new Order(buyItemOrder);
}
}
public class Order {
public Order(List<Item> buyItemOrder) {
this.buyItemOrder = buyItemOrder; // MainController에서 전달받은 buyItemOrder를 사용
}
}
이런 식으로 자원공유를 해서 private List <Item> buyItemOrder를 clear()할 때 값이 깨끗이 지울 수 있었다.
2. Stream() 사용
stream() 사용이 익숙하지 않아서 찾아보고 공부하는데 좀 오래 걸렸다.
다음에 또 쓰면 헤매지 않을까...? 싶다 ㅋㅋㅋ
'Java > project' 카테고리의 다른 글
호텔 예약 프로그램(3) (0) | 2023.10.27 |
---|---|
호텔 예약 프로그램(2) (1) | 2023.10.26 |
호텔 예약 프로그램(1) (0) | 2023.10.24 |
[JAVA] 키오스크 만들기(2일차) (1) | 2023.10.19 |