Main
우선 메인 함수에서 메뉴 리스트, 상품 리스트를 생성
public class Main {
public static ArrayList<Menu> mainMenuList = new ArrayList<>(); // 메인 메뉴 리스트
public static Order order = new Order(); // Order 객체 생성
public static void displayMainMenu(){
// 메인 메뉴 출력
}
public static void main(String[] args) {
// 메인 (메뉴 리스트) 생성
Menu coffeeMenu = new Menu("Coffee", "스타벅스만의 아라비카 커피");
mainMenuList.add(coffeeMenu);
...
// 커피, 스무디, 디저트, 빵 (상품 리스트) 생성
coffeeMenu.menuList.add(new Products("Espresso", "에스프레소 설명", 4000));
coffeeMenu.menuList.add(...);
...
// 메인 메뉴 실행
displayMainMenu();
}
displayMainMenu
메서드에서 메뉴 화면 실행 부분을 구현
public static void displayMainMenu(){
// 메인 메뉴 출력
System.out.println("Starbucks에 오신 것을 환영합니다.");
System.out.println("\n[ MENU ] ");
// 메뉴 리스트 출력
int i = 1;
for(Menu m : mainMenuList)
System.out.println(i++ + ". " + m.getName() + " | " + m.getScript());
System.out.println("\n[ ORDER ] ");
System.out.println(i++ + ". " + order.getName() + " | " + order.getScript());
System.out.println(i + ". " + "Cancel" + " | " + "진행중인 주문을 취소합니다.");
inputMenu(); // 메뉴 입력
}
메뉴 번호 선택시 동작하는 부분은 inputMenu
메서드에 구현
원래 displayMainMenu
안에 있던 부분이지만 잘못된 입력시 재실행이 용이하기 위해, 그리고 코드를 알아보기 편하게 하기 위해 inputMenu
메서드를 따로 생성했다.
displayOrder
메서드 실행clearOrder
메서드 실행inputMenu
메서드 재실행public static void inputMenu(){
// 메뉴 입력
System.out.print("\n메뉴 번호를 선택해주세요 : ");
int select = sc.nextInt();
if(select == 1 || select == 2 || select == 3 || select == 4) {
Menu m = mainMenuList.get(select - 1); // 해당 메뉴 객체 선택
order.addList(m.displayMenu());
// 상품 메뉴 리스트 출력 -> 상품 선택 -> 상품 객체 return -> 장바구니 추가
}
else if(select == 5) {
order.displayOrder(); // 장바구니 출력
}
else if(select == 6){
System.out.println("진행하던 주문을 취소하시겠습니까?");
System.out.print("\n1.Yes 2.No\n입력 : ");
select = sc.nextInt();
if(select == 1){
order.clearOrder(); // 장바구니 비우기
System.out.println("\n진행하던 주문이 취소되었습니다.");
}
displayMainMenu();
}
else{
System.out.println("잘못된 입력입니다.");
inputMenu(); // 잘못된 입력일 경우 재실행
}
}
Menu Class
displayMenu
메서드로 상품 메뉴판을 출력하고 상품 번호를 입력받아서 리스트에서 해당 객체를 찾아 return 한다.
public class Menu {
private String name;
private String script;
public ArrayList<Products> menuList = new ArrayList<>(); // 상품 객체 리스트로 저장
public Menu(String name, String script){
this.name = name;
this.script = script;
}
public Products displayMenu() {
Scanner sc = new Scanner(System.in);
// 상품 메뉴판 출력
System.out.println("[ " + this.name + " MENU ] ");
int i = 1;
for (Products p : menuList)
System.out.println(i++ + ". " + p.getName() + " | \u20A9 " + p.getPrice() + " | " + p.getScript());
// 상품 입력
System.out.print("\n상품 번호를 입력해주세요 : ");
int select = sc.nextInt();
return menuList.get(select - 1); // 선택한 상품 객체 return
}
}
Order Class
Order Class에 가장 많은 메서드가 있다. 장바구니와 관련된 동작들은 모두 해당 클래스에 구현했더니 이렇게 된듯하다
public class Order {
ArrayList<Products> orderList = new ArrayList<>(); // 장바구니 리스트
int totalPrice; // 총 주문 금액
int waitingNum = 1; // 대기번호
private String name = "Order";
private String script = "장바구니를 확인 후 주문합니다.";
Scanner sc = new Scanner(System.in);
}
addList
: 장바구니에 상품 추가
public void addList(Products p){
// (displayMenu()에서) 전달 받은 상품 객체 장바구니에 추가
Scanner sc = new Scanner(System.in);
System.out.println("\n" + p.getName() + " | \u20A9 " + p.getPrice() + " | " + p.getScript());
System.out.println("\n위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.print("1.확인 2.취소\n입력 : ");
String select = sc.nextLine();
if(select.equals("확인")) {
orderList.add(p); // 리스트에 추가
totalPrice += p.price; // 총 가격 업데이트
System.out.println(p.getName()+" 장바구니에 추가되었습니다.");
Main.printMainMenu();
}
}
displayOrder
: 장바구니 화면 출력 및 주문
public void displayOrder(){
// 장바구니 출력
System.out.println("[ Orders ]");
// 장바구니 내역 출력
int i = 1;
for (Products p : orderList)
System.out.println(i++ + ". " + p.getName() + " | \u20A9 " + p.getPrice());
System.out.println("\n[ Total ]");
System.out.println("\u20A9 " + totalPrice); // 총 가격 출력
System.out.print("\n1.Order 2.Main menu");
System.out.print("\n입력 : ");
int select = sc.nextInt();
if(select == 1) {
clearOrder(); // 장바구니 초기화
System.out.println("주문이 완료되었습니다!\n");
System.out.println("대기번호는 [ " + waitingNum++ +" ] 번 입니다.");
System.out.println("(3초 후 메뉴판으로 돌아갑니다.)");
waitMain(); // 3초 후 메뉴판 실행
}
else {
if(select != 2) System.out.println("잘못된 입력 입니다.");
Main.displayMainMenu();
}
}
clearOrder
: 장바구니 초기화
waitMain
: 3초후 메인 메뉴판 실행
public void clearOrder(){
orderList.clear();
totalPrice = 0;
}
public void waitMain(){
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 크기가 1인 스레드 풀 생성
scheduler.schedule(() -> { // 스케줄된 작업 정의
Main.displayMainMenu(); // 메인 메뉴판 실행
}, 3, TimeUnit.SECONDS); // 초 단위, 3초뒤
scheduler.shutdown(); // 스레드 풀 종료
}
Main
의 inputMenu
메서드 내에 if문으로 구현
public static void inputMenu(){
else if(select == 6){
System.out.println("진행하던 주문을 취소하시겠습니까?");
System.out.print("\n1.Yes 2.No\n입력 : ");
select = sc.nextInt();
if(select == 1){
order.clearOrder(); // 장바구니 초기화
System.out.println("\n진행하던 주문이 취소되었습니다.");
}
displayMainMenu();
}
}