- 23.10.19) TIL - 개인프로젝트(키오스크)2023년 10월 19일 20시 10분 50초에 업로드 된 글입니다.작성자: oneseel
오늘 한 일
- 개인프로젝트 필수 요구사항 이행
- 선택 사항 추가( 주문 개수 기능 추가)
어제에 이어 오늘도 개인프로젝트를 만들었다.
주문클래스를 만들고 어지럽게 펼쳐진 Map도 정리했다. 프로젝트에서 기본적으로 요구하던 사항을 마무리 했고, 추가적인 선택사항까지 일부 구현했다.
<Order class>
1) ArrayList를 이용해서 물품을 넣는 식으로 만들었다.
2) 장바구니에 물품을 추가하는 메서드
- MenuItemsMap과 choice 두 개의 매개변수를 가지고 있다.
- choice로 선택된 메뉴를 selectedItem에 넣고 이걸 카트 배열에 추가한다.
3) 장바구니에 있는 물품을 전부 제거하는 메서드
- clear라는 메서드를 이용.
4) 장바구니에 있는 물품을 확인하는 마세드
- if문을 이용해 비어있을 경우에는 isEmpty메서드를 이용해 비어있다고 출력하게 하고 그게 아니면 반복문을 이용해 카트에 있는 물품들을 차례로 출력하게 한다.
5) 장바구니에 있는 물품의 가격을 더하는 메서드
- 반복문을 이용해서 카트에 있는 물품의 가격을 더한다.
public class Order { private ArrayList<MenuItems> cart = new ArrayList<>(); // 메서드 // 장바구니에 물품을 추가하는 메서드 public void addToCart(Map<Integer, MenuItems> menuItemsMap, int choice) { MenuItems selectedItem = menuItemsMap.get(choice); cart.add(selectedItem); } // 장바구니에 있는 물품을 전부 제거하는 메서드 public void clearOrder() { cart.clear(); } // 장바구니에 있는 물품을 확인하는 메서드 public void getOrder() { if (cart.isEmpty()) { System.out.println("장바구니가 비어 있습니다."); } else { for (MenuItems item : cart) { System.out.println(item.getMenuName() + " \t|\t " + item.getMenuItemsPrice() + " \t|\t " + item.getMenuDescription()); System.out.println(); } } } // 장바구니에 있는 물품의 가격을 더하는 메서드 public double totalOrder() { double sum = 0; for (MenuItems item : cart) { sum += item.getMenuItemsPrice(); } return sum; } }
<Main class>
1) Map 부분
- 어제 while문 안에 있던 상품들의 맵들을 따로 분리해서 각각 맵으로 만들었다.
- 그리고 그 맵들을 통합한 menuItemMap을 만들었다. 맵도 밸류로 받을 수 있는 것을 알게 되었다.
- 분리한 이유 : 기존에 하나의 맵으로 했었는데, 이렇게 하니깐 주문을 하면 값이 마지막에 입력된 맵에서만 나와서 1번 상품과 2번 상품이 같이 나오지 않았다. 그래서 맵을 전부 분리했다.
- 주문 클래스에 있는 메서드도 활용하기 위해 주문 객체도 만들었다.
- 주문 이후에 있을 손님에 대기 번호를 출력하기 위해 대기 번호도 초기화했다.
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Order order = new Order(); Map<Integer, Menu> menuMap = new HashMap<>(); Map<Integer, Map<Integer, MenuItems>> menuItemsMap = new HashMap<>(); Map<Integer, MenuItems> chickenMap = new HashMap<>(); Map<Integer, MenuItems> burgerMap = new HashMap<>(); Map<Integer, MenuItems> sideMap = new HashMap<>(); Map<Integer, MenuItems> drinkMap = new HashMap<>(); int choice; // 메뉴 선택 int waitingNumber = 0; // 대기 번호 // 메뉴맵 menuMap.put(1, new Menu("Chicken", "치킨입니다.")); menuMap.put(2, new Menu("Hamburger", "햄버거입니다.")); menuMap.put(3, new Menu("Side", "사이드입니다.")); menuMap.put(4, new Menu("Drink", "음료입니다.")); // 상품맵 menuItemsMap.put(1, chickenMap); menuItemsMap.put(2, burgerMap); menuItemsMap.put(3, sideMap); menuItemsMap.put(4, drinkMap); // 치킨맵 chickenMap.put(1, new MenuItems("갓양념블랙라벨", "KFC에서도 ‘양념 순살’을 먹고 싶다는 고객님들을 위해 준비했다! 블랙라벨 치킨의 변신! 닭다리 통살 블랙라벨이 갓양념과 만났다!", 3400)); chickenMap.put(2, new MenuItems("갓양념치킨", "달콤 매콤, 먹을수록 땡기는 맵달의 조화 한국인 입맛에 딱 맞춘 환상의 양념치킨", 3300)); chickenMap.put(3, new MenuItems("켄터키통다리순살치킨", "부드러운 닭다리 통살로 만든 최고급 프리미엄 치킨", 3100)); chickenMap.put(4, new MenuItems("오리지널치킨", "KFC만의 11가지 비밀양념, 고압쿠킹 방식으로 육즙이 살아있어 촉촉 담백한 오리지널치킨", 3000)); chickenMap.put(5, new MenuItems("핫크리스피치킨", "KFC만의 비법으로 매콤 바삭하게 튀겨낸 KFC 핫크리스피치킨", 3000)); // 버거맵 burgerMap.put(1, new MenuItems("캡새버거", "탱글탱글한 새우살이 콕콕 그 새우버거가 KFC에서 더 맛있게 나왔새우", 4300)); burgerMap.put(2, new MenuItems("불고기버거", "달콤한 불고기 소스와 부드러운 패티로 더 맛있어진 불고기버거", 4300)); burgerMap.put(3, new MenuItems("징거버거", "더 커진 닭가슴살필렛과 상큼한 토마토가 어우러진 대표 치킨버거", 5500)); burgerMap.put(4, new MenuItems("켄터키통다리스파이시", "육즙가득 닭다리살에 스콜쳐소스로 매콤하게, 해시브라운으로 든든하게!", 7000)); burgerMap.put(5, new MenuItems("블랙라벨폴인치즈버거", "부드러운 통닭다리살과 크림치즈, 고다치즈, 블루치즈의 완벽한 조화의 버거", 7700)); // 사이드맵 sideMap.put(1, new MenuItems("핫봉스틱(2조각)", "핫윙 출시 30주년 기념, 더 놀라운 맛으로 돌아온 핫봉스틱!", 3500)); sideMap.put(2, new MenuItems("텐더(2조각)", "담백한 치킨 안심살로 만들어 깔끔하게 먹을 수 있는 KFC 순살 치킨스낵", 3000)); sideMap.put(3, new MenuItems("너겟(4조각)", "순 닭고기살로 만들어 부드럽고 쫄깃한 치킨너겟", 2200)); sideMap.put(4, new MenuItems("케이준후라이", "케이준 양념으로 더욱 고소하고 바삭해진 KFC 케이준후라이", 2300)); sideMap.put(5, new MenuItems("롱치즈스틱", "100% 자연산 치즈가 길~게 늘어나는 고소한 롱치즈스틱", 2000)); // 음료맵 drinkMap.put(1, new MenuItems("코카콜라", "속까지 시원해지는 청량음료의 대표! 콜라", 2400)); drinkMap.put(2, new MenuItems("스프라이트", "속까지 시원해지는 청량음료 스프라이트!", 2400)); drinkMap.put(3, new MenuItems("아이스아메리카노", "KFC만의 고품질 원두를 사용해 향과 맛이 뛰어난 차가운 아메리카노", 2200)); drinkMap.put(4, new MenuItems("아이스초코", "KFC에서 즐기는 달콤한 아이스초코", 2200)); drinkMap.put(5, new MenuItems("오렌지주스", "KFC 오렌지주스", 2000));
2) While문 (메인 메뉴와 상품 메뉴)
- 주문 확인이 되면, addToCart 메서드를 이용해 cart에 품목을 추가한다.
- case 4까지 반복된다.
while (true) { // <메인 메뉴> System.out.println("KFC에 오신걸 환영합니다."); System.out.println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요."); System.out.println(); System.out.println("[KFC MENU]"); for (int i = 1; i <= menuMap.size(); i++) { Menu menu = menuMap.get(i); System.out.println(i + ". " + menu.getMenuName() + " \t|\t " + menu.getMenuDescription()); } System.out.println(); System.out.println("[ORDER MENU]"); System.out.println("5. Order \t|\t 장바구니를 확인 후 주문합니다."); System.out.println("6. Cancel \t|\t 진행중인 주문을 취소합니다."); System.out.println(); choice = sc.nextInt(); System.out.println(); switch (choice) { // <1번 치킨 상품> case 1: System.out.println("KFC에 오신걸 환영합니다."); System.out.println("아래 상품메뉴판을 보시고 메뉴를 골라 입력해주세요."); System.out.println(); System.out.println("[CHICKEN MENU]"); for (int i = 1; i <= chickenMap.size(); i++) { MenuItems chickenGoods = chickenMap.get(i); System.out.println(i + ". " + chickenGoods.getMenuName() + " \t|\t " + chickenGoods.getMenuItemsPrice() + " \t|\t " + chickenGoods.getMenuDescription()); } int chickenChoice = sc.nextInt(); System.out.println(); goodsChoiceMethod(sc, chickenMap, chickenChoice); order.addToCart(chickenMap, chickenChoice); break;
3) While문 (주문하기와 취소하기)
- getOrder 메소드를 이용해서 cart에 있는 물품을 출력한다.
- totalOrder 메소드를 이용해서 cart에 있는 물품의 값을 출력한다.
- 주문확인을 switch를 이용해서 입력하게 하고, 1번을 입력하면 "주문이 완료되었다"라고 출력되고 대기번호 값이 증가한다. 그리고 clear메서드를 이용해서 기존의 장바구니에 있던 물품을 초기화 해준다.
- 3초 대기를 위해 thread.sleep을 이용한다. (예외처리 부분은 좀 더 쓰레드 부분을 공부해야겠다.)
- 취소하기 부분은 clear 메서드를 이용했다.
// <5번 주문하기> case 5: System.out.println("아래와 같이 주문 하시겠습니까?"); System.out.println(); System.out.println("[Order Menu]"); order.getOrder(); System.out.println(); System.out.println("[Total]"); double totalPrice = order.totalOrder(); System.out.println(totalPrice); System.out.println(); System.out.println("1. 주문 \t\t 2. 메뉴판"); int orderMenuChoice = sc.nextInt(); switch (orderMenuChoice) { case 1: System.out.println(); System.out.println("주문이 완료되었습니다!"); System.out.println(); waitingNumber++; System.out.println("대기번호는 [ " + waitingNumber + " ] 번 입니다."); System.out.println("(3초후 메뉴판으로 돌아갑니다.)"); System.out.println(); order.clearOrder(); try { Thread.sleep(3000); // 3초 대기 } catch (InterruptedException e) { e.printStackTrace(); } break; case 2: System.out.println("메뉴판으로 돌아갑니다."); System.out.println(); break; default: System.out.println("잘못된 입력입니다. 메뉴판으로 돌아갑니다."); System.out.println(); } break; // <6번 취소하기> case 6: System.out.println("진행하던 주문을 취소하시겠습니까?"); System.out.println("1. 확인 \t\t 2. 취소"); int cancelChoice = sc.nextInt(); System.out.println(); switch (cancelChoice) { case 1: order.clearOrder(); System.out.println("진행하던 주문이 취소되었습니다."); System.out.println(); break; case 2: System.out.println("메뉴판으로 돌아갑니다."); System.out.println(); break; } break;
4) 주문 개수 기능 추가
- 기존 Order class에 있는 장바구니에 물품을 추가하는 메서드에 반복문을 이용해 기존 장바구니에 선택된 물품이 있는지를 확인하고 있다면 MenuItems class에 있는 수량을 증가시키는 메서드를 이용해 수량을 증가시키고 boolean을 이용해 true값을 받고 만약에 물품이 없었다면 기존의 방식대로 장바구니에 추가한다.
- 장바구니가 비어있을 경우 오류가 생겨서 selectedItem != null을 이용해서 해결했다.
public void addToCart(Map<Integer, MenuItems> menuItemsMap, int choice) { MenuItems selectedItem = menuItemsMap.get(choice); if (selectedItem != null) { // 장바구니에 이미 같은 메뉴가 있는지 확인 boolean isAlreadyInCart = false; for (MenuItems item : cart) { if (item.getMenuName().equals(selectedItem.getMenuName())) { item.increaseItemCount(); // 이미 장바구니에 있는 경우 수량 증가 isAlreadyInCart = true; break; } } if (!isAlreadyInCart) { cart.add(selectedItem); } } else { System.out.println("선택한 메뉴가 없습니다. 다시 시도해주세요."); } }
public int getMenuItemCount() { return menuItemCount; } public void increaseItemCount() { menuItemCount++; } }
내일 할 일
- 선택 요구사항에 있는 것들 최대한 해볼 수 있는 거 하고 마무리 짓기
- 예외처리 할 수 있는 것 해보기
'TIL' 카테고리의 다른 글
23.10.24) 팀 프로젝트 - 호텔 예약 프로그램 (0) 2023.10.24 23.10.20) TIL - 개인프로젝트(키오스크) (1) 2023.10.20 23.10.18) TIL - 개인프로젝트(키오스크) (1) 2023.10.18 23.10.17) TIL (0) 2023.10.17 23.10.12) Java 문법 2일차(요리 레시피 메모장 만들기2) (0) 2023.10.13 댓글