✨
내일배움캠프) JAVA 개인 프로젝트 과제 구현 1차
October 19, 2023
자바 강의 완강 후 시작 된 개인 프로젝트! 키오스크 만들기이다. 1차 기능 구현은 완료했지만 아직 부족한 부분이 많이 보인다. 선택 요구사항을 구현하면서 차차 고쳐나가봐야지!
Main.java
public class Main {
public static void main(String[] args){
KioskApp app = new KioskApp();
app.insertMenu();
app.kiosk();
}
}
- 프로젝트의 메인 클래스
- KioskApp 객체를 생성한 후
insertMenu()
메소드로 메뉴를 세팅하고,kiosk()
메소드로 키오스크를 실행했다.
KioskApp.java
import java.util.*;
public class KioskApp {
private Map<Integer, List<Product>> allMenuMap = new HashMap<>(); // 전체 메뉴 지도
private List<Menu> menuList = new ArrayList<>(); // 메뉴 리스트
private List<Product> tteokbokkiList = new ArrayList<>(); // 떡볶이 리스트
private List<Product> sideList = new ArrayList<>(); // 사이드 메뉴 리스트
private List<Product> drinkList = new ArrayList<>(); // 음료 리스트
private List<Product> mealKitList = new ArrayList<>(); // 밀키트 리스트
Order order = new Order();
public void insertMenu(){
//메인 메뉴
menuList.add(new Menu("Tteokbokki", "계속 생각나는 매운맛! 엽기떡볶이🥵"));
menuList.add(new Menu("Side", "엽떡과 같이 먹으면 더 맛있어요🍙"));
menuList.add(new Menu("Drinks", "매움을 달래주기 위한 음료🧃"));
menuList.add(new Menu("Meal Kit", "어디서든 엽떡을 즐겨보세요🌳"));
//떡볶이 메뉴
tteokbokkiList.add(new Product("엽기떡볶이", "엽떡을 즐길줄 안다면 역시 오리지널!", 14000));
tteokbokkiList.add(new Product("짜장떡볶이", "아이들이 먹기 좋아요", 16000));
tteokbokkiList.add(new Product("로제떡볶이", "매운게 싫다면 부드러운 로제가 안성맞춤", 16000));
tteokbokkiList.add(new Product("마라떡볶이", "전국품절 마라떡볶이! 재입고 되었습니다.", 16000));
sideList.add(new Product("셀프 주먹김밥", "오물조물 만들어서 먹어요.", 2000));
sideList.add(new Product("계란야채죽", "매운맛 소화기", 5000));
sideList.add(new Product("순대", "떡볶이에 순대는 빠질수 없습니다.", 3000));
sideList.add(new Product("야채튀김", "튀김도 마찬가지로 빠질수 없습니다.", 1000));
drinkList.add(new Product("제로콜라", "살찌는게 걱정이라면 제로를 선택하세요.", 2000));
drinkList.add(new Product("쿨피스", "매운걸 못먹는 분은 쿨피스 필수입니다.", 1000));
mealKitList.add(new Product("오리지널맛", "엽떡을 즐길줄 안다면 역시 오리지널!", 15000));
mealKitList.add(new Product("착한맛", "아이들이 먹기 좋아요", 15000));
allMenuMap.put(1, tteokbokkiList);
allMenuMap.put(2, sideList);
allMenuMap.put(3, drinkList);
allMenuMap.put(4, mealKitList);
}
public void kiosk(){
while(true){
int menuNum = printMenu(); //메인메뉴 출력
if(menuNum == 6){ // 진행중인 주문 취소
order.cancelOrder();
}else if(menuNum == 5){
if(order.printOrderList() == 1){
int waitingNum = order.getWaitingNum();
System.out.println("주문이 완료되었습니다.");
System.out.println("대기번호는 [" + waitingNum + " ]번 입니다.");
System.out.println("(3초 후 메뉴판으로 돌아갑니다.)");
order.setWaitingNum(waitingNum + 1);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}else{
int productNum = printMenu(menuNum); // 입력받은 숫자에 따른 상세 메뉴 출력
Product selectProduct = allMenuMap.get(menuNum).get(productNum-1); //선택한 상품에 대한 정보 가져오기
order.addProduct(selectProduct); // 카트에 담기
}
}
}
/**
* 메인 메뉴 출력
*/
public int printMenu(){
System.out.println("🧡 엽기떡볶이에 오신걸 환영합니다. 🧡");
System.out.println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.");
System.out.println();
System.out.println("[ 🔥 YUPDDUCK MENU 🔥 ]");
int index = 1;
for(Menu m : menuList){
System.out.print(index++ +". ");
m.print();
}
System.out.println("[ 💛 ORDER MENU 💛 ]");
System.out.print(index++ +". ");
System.out.printf("%-15s | %s%n", "Order", "장바구니를 확인 후 주문합니다.⭕");
System.out.print(index +". ");
System.out.printf("%-15s | %s%n", "Cancel", "진행중인 주문을 취소합니다.❌");
System.out.println();
Scanner sc = new Scanner(System.in);
return sc.nextInt();
}
/**
* 상세 메뉴 출력
*/
public int printMenu(int selectNum) {
String menu = "TTEOKBOKKI";
int index = 1;
if(selectNum == 2){
menu = "SIDE";
}else if(selectNum == 3){
menu = "DRINK";
}else if(selectNum == 4){
menu = "MEAL KIT";
}
System.out.println("엽기떡볶이에 오신걸 환영합니다.");
System.out.println("아래 상품메뉴판을 보시고 상품을 골라 입력해주세요.");
System.out.println();
System.out.println("[ 🔥 "+ menu + " MENU 🔥 ]");
//메뉴 리스트 출력
for(Product p : allMenuMap.get(selectNum)){
System.out.print(index++ +". ");
p.print();
}
System.out.println();
Scanner sc = new Scanner(System.in);
return sc.nextInt();
}
}
- 키오스크 실행 클래스, 메뉴를 출력하는 메소드를 오버로딩하여 사용했다.
- 인스턴스 변수
allMenuMap
: 상세 메뉴 전체를 담는 리스트menuList
: 메인 메뉴를 담는 리스트tteokbokkiList
,sideList
,drinkList
,mealKitList
: 각각의 상세메뉴를 담는 리스트
- 인스턴스 메소드
insertMenu()
: 키오스크 실행 전, 메뉴를 세팅하는 메소드kiosk()
: 키오스크 실행 메소드printMenu()
: 메인 메뉴 출력 메소드printMenu(int selectNum)
: 상세 메뉴 출력 메소드
Menu.java
public class Menu {
private String name;
private String description;
public Menu(String name, String description) {
this.name = name;
this.description = description;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public void print(){
System.out.printf("%-15s | %s%n", getName(), getDescription());
}
}
- 메인메뉴 클래스
print()
: 선택한 메뉴를 화면에 출력함
Product.java
public class Product extends Menu{
public Product(String name, String description, int price) {
super(name, description);
this.price = price;
}
private int price;
public int getPrice() {
return price;
}
@Override
public void print(){
System.out.printf("%-15s | ₩ %s | %s%n", super.getName(), getPrice(), super.getDescription());
}
}
- 상세 메뉴 클래스
print()
: 상속받은 Menu의print()
메소드를 재정의해서 사용함
Order.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Order {
private List<Product> orderList = new ArrayList<>();
private int waitingNum;
public Order() {
this.waitingNum = 1;
}
public List<Product> getOrderList() {
return orderList;
}
public void setWaitingNum(int waitingNum) {
this.waitingNum = waitingNum;
}
public int getWaitingNum() {
return waitingNum;
}
/**
* 장바구니 담기
* @param product : 사용자가 선택한 상품
*/
public void addProduct(Product product) {
product.print();
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인 2. 취소");
Scanner sc = new Scanner(System.in);
int cartNum = sc.nextInt();
if (cartNum == 1) {
orderList.add(product);
System.out.println("🛒 " + product.getName() + "가 장바구니에 추가되었습니다. 🛒");
}else{
System.out.println("❗ 취소되었습니다. ❗");
}
}
/**
* 주문내역, 총 가격 출력
* @return
*/
public int printOrderList(){
System.out.println("아래와 같이 주문하시겠습니까?");
System.out.println("[ Orders ]");
int totalPrice = 0;
for (Product product : getOrderList()) {
totalPrice += product.getPrice();
product.print();
}
System.out.println("[ Total Price ]");
System.out.println(totalPrice);
System.out.println("1. 주문 2. 메뉴판");
Scanner sc = new Scanner(System.in);
return sc.nextInt();
}
/**
* 주문 취소
*/
public void cancelOrder(){
System.out.println("진행중이던 주문을 취소하시겠습니까?");
System.out.println("1. 확인 2. 취소");
Scanner sc = new Scanner(System.in);
if(sc.nextInt() == 1){
orderList.clear();
System.out.println("진행중이던 주문이 취소되었습니다.");
}
}
}
- 주문 클래스, 주문에 관련된 메소드가 작성되어 있음
waitingNum
: 주문 객체 생성시 대기번호를 1로 초기화 함addProduct(Product product)
: 선택된 상품을 장바구니에 담는 메소드printOrderList()
: 주문 내역과 총 가격을 출력하는 메소드- 주문 내역에서 가격들을 가져와 총 가격을 계산한다.
cancelOrder()
: 주문 취소 메소드- 주문이 취소되면 장바구니를 비운다.