오늘 TIL 은 개인으로 만든 키오스크 구현을 정리할려고 한다.
필수 기능까지 구현하였고 추후에 장바구니 기능,Enum 활용 등 추가 예정이다.
📃 필수 요구사항
✅ 기능 설명
- 메인 메뉴판 화면: 사용자는 메인 메뉴에서 카테고리를 선택할 수 있으며, 주문 및 종료 옵션이 제공된다.
- 상품 메뉴판 화면: 카테고리를 선택하면 해당 카테고리의 메뉴가 출력됩니다.
- 구매 화면: 사용자가 메뉴를 선택하면 장바구니에 추가할지 확인하는 메시지가 표시됩니다. 추가할 경우 장바구니에 추가됩니다.
- 주문 화면:장바구니의 내용과 총 가격이 출력됩니다. 사용자가 주문할 경우 주문이 완료되고 대기번호가 발급
✅ 클래스 설명
Main 클래스
역할: 프로그램의 진입점으로, 전체 애플리케이션을 실행하는 주체
책임: 메뉴 객체를 생성하고 초기화하며, Kiosk 객체를 생성하여 애플리케이션의 시작을 담당
Kiosk 클래스
역할: 사용자와 상호작용하는 주체로, 메뉴와 장바구니 관리 기능을 제공
책임: 메뉴를 출력하고, 사용자의 선택을 처리
장바구니에 메뉴 항목을 추가하거나, 주문 및 취소를 관리
사용자로부터 입력을 받아 프로그램의 흐름을 제어
Menu 클래스
역할: 특정 카테고리의 메뉴 항목을 관리하는 객체
책임: 카테고리 이름과 해당 카테고리에 포함된 메뉴 항목 리스트를 관리
메뉴 항목을 추가하고, 메뉴를 출력하는 기능을 제공
MenuItem 클래스
역할: 개별 메뉴 항목을 나타내는 데이터 객체
책임: 메뉴 항목의 이름, 가격, 설명을 저장하고, 이를 반환하는 메소드를 제공
MenuItem 클래스
우선 MenuItem 에서 항목의 이름,가격 그리고 설명을 저장할 수 있는 데이터 객체 클래스를 생성하였다.
public class MenuItem {
private final String name;
private final Double price;
private final String content;
public MenuItem(String name, Double price, String content) {
this.name = name;
this.price = price;
this.content = content;
}
//name 값 추출
public String getName() {
return name;
}
//price 값 추출
public Double getPrice() {
return price;
}
//content 값 추출
public String getContent() {
return content;
}
}
Menu 클래스
MenuItem 클래스를 만들었다면 관리하는 클래스가 필요하다.여기엔 버거 메뉴,음료 메뉴 등 각 카테고리 내에 여러 MenuItem 을 포함한다.
또한 나중에 키오스크에서 카테고리를 메뉴에 보여줘야 하기 때문에 카테고리 이름을 반환하는 메서드가 구현되어야 한다.
import java.util.ArrayList;
import java.util.List;
public class Menu {
String category;
List<MenuItem> menuItemList;
public Menu(String category){
this.category = category;
this.menuItemList = new ArrayList<>();
}
//Menuitem 을 menuItemList에 추가하는 메소드
public void addMenuItem(MenuItem item){
menuItemList.add(item);
}
//카테고리 이름 추출
public String getCategoryName(){
return category;
}
//메뉴 보여주기
public void viewMenu(){
System.out.println("[ " + category + " MENU ]");
for (int i = 0; i < menuItemList.size(); i++) {
MenuItem item = menuItemList.get(i);
System.out.println(i + 1+". "+item.getName() + " | ₩ "+item.getPrice()+ " | "+ item.getContent());
}
System.out.println("0. 뒤로가기");
}
//MenuItem 리스트 추출
public List<MenuItem> getMenuItemList(){
return menuItemList;
}
}
Kiosk 클래스
여기서 사용자와 상호작용을 통해 입력 데이터를 관리하고 전체적인 순서를 제어한다.
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
private final List<Menu> mainMenu;
//Kiosk 생성자
public Kiosk() {
mainMenu = new ArrayList<>();
}
//mainMenu 추가
public void addMenu(Menu menu) {
mainMenu.add(menu);
}
//Kiosk 시작
public void start() {
Scanner sc = new Scanner(System.in);
int categoryChoice;
do {
System.out.println("[ MAIN MENU ]");
for (int i = 0; i < mainMenu.size(); i++) {
System.out.println((i + 1) + ". " + mainMenu.get(i).getCategoryName());
}
System.out.println("0. 종료");
categoryChoice = sc.nextInt();
if (categoryChoice > 0 && categoryChoice <= mainMenu.size()) {
Menu choiceMenu = mainMenu.get(categoryChoice - 1);
choiceMenu.viewMenu();
System.out.println("메뉴를 선택하세요");
int itemChoice = sc.nextInt();
if (itemChoice > 0 && itemChoice <= choiceMenu.getMenuItemList().size()) {
MenuItem chosenItem = choiceMenu.getMenuItemList().get(itemChoice - 1);
System.out.println("선택한 메뉴:"+chosenItem.getName() + " | ₩ "+chosenItem.getPrice()+ " | "+ chosenItem.getContent());
} else if(itemChoice == 0) {
continue;
}
else{
System.out.println("올바르지 않은 선택입니다.");
}
}
} while (categoryChoice != 0);
sc.close();
}
}
Main 클래스
카테고리를 생성하고 카테고리 별 menuItem 리스트 생성하여 데이터를 삽입시키고 Kiosk 클래스를 실행시키면 된다.
public class Main {
public static void main(String[] args) {
Menu burgerMenu = new Menu("BURGERS"); // 버거 메뉴 생성
Menu drinkMenu = new Menu("DRINKING"); // 음료 메뉴 생성
Menu dessertMenu = new Menu("DESSERT"); // 디저트 메뉴 생성
burgerMenu.addMenuItem(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgerMenu.addMenuItem(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
drinkMenu.addMenuItem(new MenuItem("Cider", 1.0, "사이다"));
drinkMenu.addMenuItem(new MenuItem("Vanilla Shake", 2.0, "바닐라 쉐이크"));
drinkMenu.addMenuItem(new MenuItem("Cola", 1.0, "콜라"));
dessertMenu.addMenuItem(new MenuItem("Potato Fries", 1.5, "감자튀김"));
dessertMenu.addMenuItem(new MenuItem("Shake Shake Chicken", 3.0, "쉑쉑치킨"));
Kiosk kiosk = new Kiosk();
kiosk.addMenu(burgerMenu);
kiosk.addMenu(drinkMenu);
kiosk.addMenu(dessertMenu);
kiosk.start();
}
}
✒️ 회고
- 요구사항에 맞게 클래스와 메소드를 구성하는데 꽤 많은 시간이 걸렸다. 요즘 프로그래밍을 연습하면서 많이 느끼는 건 코드를 구현하는 거 보다 요구 사항에 맞는 구성으로 구현하는 게 더 어렵다고 느껴진다.
- 요구사항을 이해하기 위해 코딩을 무작정 시작하는 것이 아니라 전체적인 흐름을 생각해서 메모장이나 그림을 이용해 패키지 및 클래스를 그려보고 기능을 담당하는 메소드 별로 정리 해놓으면 시간을 절약할 수 있을 것 같다.
'TIL' 카테고리의 다른 글
[TIL]키오스크 만들기(2025-03-14) (0) | 2025.03.14 |
---|---|
[TIL]키오스크 만들기(2025-03-12) (1) | 2025.03.12 |
[TIL]Lv3 계산기 만들기(2025-02-28) (0) | 2025.02.28 |
[TIL]Lv2 계산기 만들기(2025-02-26) (0) | 2025.02.26 |
[TIL]Lv1 계산기 만들기(2025-02-25) (0) | 2025.02.25 |