팀원들의 도움으로 내 코드의 어떤부분이 문제인지, 어떻게 개선하면 좋을지, 가이드를 얻을 수 있었다...(감사합니다ㅠㅠ)

(1) 너무나도 절차지향적인 코드를 생산해낸 멋진(negative) 나^^...
Menu클래스만 보더라도, 한 클래스에서 너무 많은 기능을 담당하고 있다. (리스트, 메뉴추가, getter, 메뉴출력 등)

카테고리를 만들겠다고 굳이 HashMap을 사용한점 → 다른 방법으로 개선해보자
(2) if-else문의 중첩 반복
orderList에 담은 메뉴 리스트가 있냐 없냐에 따라서 다른 로직을 만들어야했기에 아래처럼 if문을 중첩해서 만들었는데, 만들고보니 미친듯이 중복되고 비효율적인 모습을 볼 수 있었따....
→ input 클래스를 따로 분리해 만들어 해결해보자

먼저 Menu클래스를 바꿔보자
리스트를 하나씩 다 만드는게 아니라, 생성자를 이용해서 만들 수 있다.
private final String category;
private final List<MenuItemCh1> menuItemCh1s;
//생성자에서 카테고리명과 리스트를 함께 할당하기 -> 호출될때마다 새로운 리스트를 만든다.
public MenuCh1(String category){
this.category = category;
this.menuItemCh1s = new ArrayList<>();
}
생성자를 통해 카테고리명과 리스트를 함께 생성할 수 있도록했다.
이렇게 하면 메뉴리스트 만들고 해쉬맵 만들어서 엮어줄 필요없이, 한 번에 Menu클래스를 불러올때마다 새로운 메뉴 세트를 만들어낼 수 있다!
더불어 카테고리명과 세부 메뉴를 리턴할 수 있는 getter 메서드도 함께 설정해주자
public String getMenuCategory(){
return category;
}
//세부 메뉴 리턴
public List<MenuItemCh1> getMenuItemCh1s(){
return menuItemCh1s;
}
//세부 메뉴 프린트하기
public void printDetailMenus(){
System.out.println("[ "+category +" ]");
for (int i = 0; i< menuItem1.size(); i++){
MenuItem1 menus = menuItem1.get(i);
System.out.println(i+1 +". "+menus.getName() +" | W "+ menus.getPrice()+" | " + menus.getDescription());
}
}
변경한 Menu클래스에 따라 Main클래스도 변경했다.
메뉴 생성자에서 정의했던 것과 같이, 카테고리명을 적어서 넘겨준다
//메뉴 추가하기
Menu1 BurgerList = new Menu1("Burgers");
Menu1 DrinkList = new Menu1("Drinks");
Menu1 DessertList = new Menu1("Desserts");
그러면 아래의 Menu클래스의 생성자에게 넘어가서 새로운 리스트를 생성하게된다.
public Menu1(String category){
this.category = category;
this.menuItemCh1s = new ArrayList<>(); //여기!!
}
Menu 객체가 생성될때 카테고리 이름을 받아서 category변수에 저장!
동시에 menuItem1이라는 리스트가 생성되어서, 이에 맞는 메뉴아이템 저장 준비 완.
Menu클래스의 addMenuDetail()메서드를 활용해서 리스트에 메뉴를 추가한다
BurgerList.addMenuDetail("ShackBurger ", 6.9, "토마토, 양상추, 쉑 소스가 토핑된 치즈버거");
DrinkList.addMenuDetail("Lemonade", 3.9, "매장에서 직접 만드는 상큼한 레몬에이드");
DessertList.addMenuDetail("Cheese Fries", 5.2, "바삭한 감자와 치즈");
이제 이 추가된 메뉴들의 카테고리와 세부 메뉴들을 활용하려면 Kiosk클래스에서 받아주어야한다.
public class Kiosk1 {
추가 및 변경된 내용만 기술
private final List<Menu1> menu1; // Menu1 객체들을 담을 리스트 선언
//키오스크 클래스에서
public Kiosk1(){
this.menu1 = new ArrayList<>();
}
public void addMenus(Menu1 menu1){
this.menu1.add(menu1);
}
Kiosk객체를 생성할 때마다, 메뉴 리스트가 새로 만들어지고, 나중에 메뉴들을 추가 갈 완료.
public void addMenus(Menu1 menu1){
this.menu1.add(menu1);
}
리스트들(BurgerList, DrinkList, DessertList)을 menu1리스트에 추가해준다.
변경된 코드에 따라 내부 플로우도 변경해보자
//메뉴 카테고리 출력
for (Menu1 menu1 : menu1) {
System.out.println(i++ +". " + menu1.getMenuCategory());
}
향상된 for문을 활용해서 menu1을 하나씩 불러오면서 getMenuCategory() 메서드를 활용해 카테고리 명만 출력할 수 있도록 한다.
기존에 중복으로 if문을 사용해 비효율적이었던 코드를 switch-case로 변경했다.
//switch-case로 번호 선택 로직
switch (select){
case 0:
System.exit(0);
case 4 :
orderList.printOrderList();
System.out.println("\n" +"[ Total ] \n" + "W " + orderList.getTotalPrice());
case 5 :
System.out.println("주문 취소합니다");
orderList.clearOrderList(); //장바구니 비우기
break;
default:
Menu1 selectCategory = menu1.get(select-1); //해당하는 카테고리의 리스트 찾기
System.out.println("> "+ menu1.get(select-1).getMenuCategory()+"를 선택하셨습니다 <");
selectMenuDetail(selectCategory); //세부 메뉴로 넘어가기
}
}
이때 겉에 while문이 감싸고 있으므로, 아예 프로그램을 정지하고 싶다면(0을 입력했을때) System.exit(0);을 사용해 종료해야한다.
이렇게 변경하니 훨씬 깔끔하고 보기 좋은 코드가 될 수 있었다... 🥹