[JAVA] 키오스크 만들기(1일차)

2023. 10. 18. 23:27Java/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