*Kiosk 클래스
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Kiosk implements DeliveryOrder.OnDelivery, TakeoutOrder.OnTakeout, HereOrder.OnHereOrder {
static final int KEY = 0;
private int invCount = 0;
Map<String, Integer> menu;
Map<String, Integer> invcountMap;
public Kiosk(int invCount) {
this.invCount = invCount;
//메뉴이름과 가격이 매핑되어 있는 맵구조
menu = new LinkedHashMap<String, Integer>();
menu.put("딸기요거트", 4500);
menu.put("밀크티", 3500);
menu.put("카페라떼", 3500);
menu.put("아메리카노", 2000);
//메뉴이름과 재고개수가 맵핑되어 있는 맵구조
invcountMap = new LinkedHashMap<String, Integer>();
invcountMap.put("딸기요거트", invCount);
invcountMap.put("밀크티", invCount);
invcountMap.put("카페라떼", invCount);
invcountMap.put("아메리카노", invCount);
}
//기존 메소드
/* boolean isInventory(List<Menu> menu) {
if (invCount >= pCount) {
return true;
} else {
return false;
}
}*/
//주문(Order)에 있는 메뉴리스트(List)를 반복하여 체크
boolean isInventory(List<Menu> menu) {
for(Menu m : menu) {
if(invcountMap.get(m.getMenu())<m.getCount()) {
return false;
}
}return true;
}
public int getInvCount() {
return invCount;
}
//기존
/* void subInventory(int pCount) {
// invCount -= pCount;
}*/
//주문(Order)에 있는 메뉴리스트(List)를 반복하여 주문한 메뉴의 개수를 차감
void subInventory(List<Menu> menu) {
for(Menu m : menu) {
invcountMap.put(m.getMenu(), invCount - m.getCount());
}
}
//Menu 클래스의 인스턴스를 만들고 반환하는 메소드
public Menu initMenu(String menu, int count) throws KioskException {
Menu m = new Menu(menu, count, this.menu.get(menu));
return m;
}
// throws -> KioskException이 발생할 수 있다는 것을 명시적으로 알려줌.
// 인자를 List 형식으로 받아옴.
public Order initOrder(List<Menu> menu, int count, int orderType) throws KioskException {
boolean isValid = isInventory(menu);
if (isValid) { // 재고가 있을 때
// Order 타입에서 각 주문방법에 따라 자식 클래스타입으로 다운캐스팅
if (orderType == 1) {
// 자식클래스 인스턴스 생성
DeliveryOrder o = new DeliveryOrder(menu);
o.setOnDelivery(this); // 인터페이스 업캐스팅
return o;
} else if (orderType == 2) {
TakeoutOrder o = new TakeoutOrder(menu);
o.setOnTakeout(this);
return o;
} else if (orderType == 3) {
HereOrder o = new HereOrder(menu);
o.setOnHereOrder(this);
return o;
} else {
System.out.println("주문 방식이 잘못 입력되었습니다.");
throw new KioskException("error code: ", 103);
}
} else { // 재고가 없을 때
throw new KioskException("error code: ", 102);
}
}
// 인터페이스로 선언된 추상메소드를 kiosk클래스에서 구현
// 배달 주문 완료 시, 주문내역과 주문완료 문구 출력 (Delivery)
@Override
public void successDelivery(List<Menu> list, String locate) {
System.out.println(locate + "주소로 배달주문이 완료되었습니다.");
System.out.print("주문 내역: ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).getMenu() + " ");
}
System.out.println();
}
// 포장 주문 완료 시, 주문내역과 주문완료 문구 출력 (Takeout)
@Override
public void successTakeout(List<Menu> list, int time, int balance) {
System.out.println("잔돈 " + balance + "원입니다.");
System.out.println(time + "분 뒤 포장주문이 완료됩니다.");
System.out.print("주문 내역: ");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).getMenu() + " ");
}
System.out.println();
// for-each 사용
// for(Menu m: menu) {
// System.out.print(m.getMenu()+" ");
// }
}
// 매장 주문 완료 시, 주문내역과 주문완료 문구 출력 (Here)
@Override
public void successHere(List<Menu> list, int orderNum, int balance) {
System.out.println("잔돈 " + balance + "원 입니다. ");
System.out.println(orderNum + " 주문번호로 주문 완료 되었습니다.");
System.out.print("주문 내역: ");
for (int i = 0; i < list.size(); i++) {
String menu = list.get(i).getMenu();
System.out.print(menu + " ");
}
System.out.println();
}
// 큐에 주문이 3개 이상 추가될 시 제일 처음 추가한 주문이 제거되면서 주문 시작 (Delivery)
@Override
public void finishDelivery(List<Menu> list, String locate) {
System.out.println("주문하신 " + list.size() + "개 메뉴 나왔습니다.");
System.out.println(locate + "로 배달 시작됩니다.");
}
// 큐에 주문이 3개 이상 추가될 시 제일 처음 추가한 주문이 제거되면서 주문 시작 (Takeout)
@Override
public void finishHere(List<Menu> list, int orderNum) {
System.out.println("주문하신 " + list.size() + "개 메뉴 나왔습니다.");
System.out.println(orderNum + "번 메뉴 나왔습니다.");
}
// 큐에 주문이 3개 이상 추가될 시 제일 처음 추가한 주문이 제거되면서 주문 시작 (Here)
@Override
public void finishTakeout(List<Menu> list, int time) {
System.out.println("주문하신 " + list.size() + "개 메뉴 나왔습니다.");
System.out.println(time + "분 지나 포장주문 나왔습니다.");
}
}
*Menu 클래스
public class Menu {
// 기존 private int price;
private String mName; //메뉴 이름
private int count;
private int orderPrice; //총 가격
// 기존 Menu생성자
/* public Menu(String mName) throws KioskException {
// this.price = setPrice(menu);
// this.mName = mName;
}*/
public Menu(String mName, int count, int price) {
this.mName = mName;
this.count = count;
this.orderPrice = count * price;
}
// public int setOrderPrice(String mName, int count) {
// return orderPrice = menu.get(mName)*count;
// }
public String getMenu() {
return mName;
}
public int getPrice() {
return orderPrice;
}
public int getCount() {
return count;
}
//기존 메소드 삭제
/* int setPrice(String menu) throws KioskException {
// if (menu.equals("딸기요거트")) {
// return price = 4500;
// } else if (menu.equals("밀크티") || menu.equals("카페라떼")) {
// return price = 3500;
// return price = 2000;
// } else {
// throw new KioskException("error code: ", 101);
// }
//
}*/
}
*Run 클래스
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("키오스크 키를 입력해주세요.");
int key = scanner.nextInt();
if (key == Kiosk.KEY) {
System.out.println("매장 재고개수를 입력해주세요.");
int invCount = scanner.nextInt();
Kiosk k = new Kiosk(invCount); // 키오스크 클래스 객체 생성
Queue<Order> oList = new LinkedList<Order>(); // 주문 인스턴스를 담을 큐 인스턴스 생성
while (true) {
System.out.println("주문 방식 번호를 입력하세요. (1: 배달, 2:포장, 3:매장, 4: 종료)");
// 주문 방식에 따라 다른 출력 (1: 배달, 2:포장, 3:매장, 4: 종료)
int orderNum = scanner.nextInt();
if (orderNum == 4) {// menu="종료"시 프로그램 종료
System.out.println("프로그램 종료");
break;
}
List<Menu> list = new ArrayList<Menu>(); // 배열로 생성한 메뉴 클래스를 리스트로 변경
int count = 0;
String menu;
while (list.size() < 10) {
System.out.println("<메뉴, 개수> 또는 주문 입력해주세요.");
menu = scanner.next();
if (menu.equals("주문")) {
break;
} else {
try {
count = scanner.nextInt();
list.add(k.initMenu(menu, count));
// 리스트에 메뉴 인스턴스를 하나씩 추가 (Kiosk에 정의된 메소드를 통해 Menu 초기화)
} catch (KioskException e) {
System.out.println("에러코드: " + e.getErrCode());
System.out.println("메뉴에 없는 음료입니다.");
continue;
}
}
}
int deposit = 0;
try {
Order order = k.initOrder(list, count, orderNum);
// 주문방식에 따라 다른 가격 출력
// 1: 배달
if (orderNum == 1) {
DeliveryOrder od = (DeliveryOrder) order;
System.out.println("배달비 3000원 추가되어 " + od.getOrderPrice() + "원입니다."); // 총 주문 음료 가격
System.out.println("배달 주문은 정확한 금액을 결제해주세요.");
int money = scanner.nextInt();
deposit = money;
System.out.println("주소를 입력해주세요.");
String locate = scanner.next();
od.setLocate(locate);
// 2: 포장
} else if (orderNum == 2) {
TakeoutOrder to = (TakeoutOrder) order;
System.out.println("테이크 아웃은 500원 할인되어 " + to.getOrderPrice() + "원입니다.");
int money = scanner.nextInt();
deposit = money;
System.out.println("포장시간을 입력해주세요.");
int time = scanner.nextInt();
to.setTime(time);
// 3.매장
} else if (orderNum == 3) {
HereOrder ho = (HereOrder) order;
System.out.println(ho.getOrderPrice() + "원입니다.");
int money = scanner.nextInt();
deposit = money;
System.out.println("주문번호를 입력해주세요.");
int odNum = scanner.nextInt();
ho.setOrderNum(odNum);
}
// 정상적인 거래가 이루어지면 재고 차감 후 업데이트
if (order.runOrder(deposit)) {
k.subInventory(list);
System.out.println("현재 재고 상황: "+k.invcountMap);
// 주문 완료되면 큐에 주문 인스턴스 추가
oList.offer(order);
// 주문이 3개면 제일 처음 추가된 주문을 제거하고 주문방식에 따라 문구출력
if (oList.size() > 3) {
Order firstOrder = oList.poll();
firstOrder.finishOrder();
}
}
} catch (KioskException e) {
System.out.println(e.getMessage() + e.getErrCode());
}
}
scanner.close();
} else {
System.out.println("키오스크 키가 맞지 않습니다.");
}
}
}
-메뉴클래스를 수정하면서 메뉴클래스에 개수 값을 받아오기 때문에 메뉴클래스 정의된 개수를 활용하여 키오스크 클래스의 재고 여부 체크(isInventory())와 재고 차감(subInventory())을 사용.
-키오스크 클래스 내에서 initMenu() 메소드를 통해 런 클래스에서 메뉴클래스를 직접 초기화하던 것을 키오스크 내부에서 초기화하게 끔 수정함. (캡슐화)
-수정사항 : initMenu()메소드에서 .containKey()메소드 활용하여 메뉴 값 체크 해서 예외처리 해주기
'연습문제 및 실습 자료' 카테고리의 다른 글
자바 맵(MAP) 문제 - 포켓몬스터 (0) | 2023.08.08 |
---|---|
자바 Set구조 문제 - 로또 만들기 (0) | 2023.08.07 |
자바 컬렉션 문제 - 테트리스 게임 (0) | 2023.08.04 |
자바 리스트 문제 - 키오스크 응용(6) (0) | 2023.08.03 |
자바 다차원 배열 실습 - 사다리 게임 (0) | 2023.08.03 |