[JAVA] 키오스크(5) - 리팩토링, 근데 이제 거의 뒤엎은

림민지·2025년 3월 13일

Today I Learn

목록 보기
24/62

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

💔 기존 코드의 문제점

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

카테고리를 만들겠다고 굳이 HashMap을 사용한점 → 다른 방법으로 개선해보자

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

1️⃣ Menu클래스

먼저 Menu클래스를 바꿔보자

1. 생성자 활용하기

리스트를 하나씩 다 만드는게 아니라, 생성자를 이용해서 만들 수 있다.

private final String category;
private final List<MenuItemCh1> menuItemCh1s;

//생성자에서 카테고리명과 리스트를 함께 할당하기 -> 호출될때마다 새로운 리스트를 만든다.
public MenuCh1(String category){
	this.category = category;
    this.menuItemCh1s = new ArrayList<>();
    }

생성자를 통해 카테고리명과 리스트를 함께 생성할 수 있도록했다.
이렇게 하면 메뉴리스트 만들고 해쉬맵 만들어서 엮어줄 필요없이, 한 번에 Menu클래스를 불러올때마다 새로운 메뉴 세트를 만들어낼 수 있다!

2. getter 메서드

더불어 카테고리명과 세부 메뉴를 리턴할 수 있는 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());
        }
    }

2️⃣ Main & Kiosk 클래스

변경한 Menu클래스에 따라 Main클래스도 변경했다.

1. 메뉴 카테고리 & 리스트 생성

메뉴 생성자에서 정의했던 것과 같이, 카테고리명을 적어서 넘겨준다

//메뉴 추가하기
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이라는 리스트가 생성되어서, 이에 맞는 메뉴아이템 저장 준비 완.

2. 세부 메뉴 추가하기

Menu클래스의 addMenuDetail()메서드를 활용해서 리스트에 메뉴를 추가한다

BurgerList.addMenuDetail("ShackBurger   ", 6.9, "토마토, 양상추, 쉑 소스가 토핑된 치즈버거");
DrinkList.addMenuDetail("Lemonade", 3.9, "매장에서 직접 만드는 상큼한 레몬에이드");
DessertList.addMenuDetail("Cheese Fries", 5.2, "바삭한 감자와 치즈");

이제 이 추가된 메뉴들의 카테고리와 세부 메뉴들을 활용하려면 Kiosk클래스에서 받아주어야한다.

3. 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리스트에 추가해준다.

3️⃣ 키오스크 플로우

1. selectMenuCategory() 리팩토링

변경된 코드에 따라 내부 플로우도 변경해보자

(1) 카테고리 출력

//메뉴 카테고리 출력
for (Menu1 menu1 : menu1) {
	System.out.println(i++ +". " + menu1.getMenuCategory());
    }

향상된 for문을 활용해서 menu1을 하나씩 불러오면서 getMenuCategory() 메서드를 활용해 카테고리 명만 출력할 수 있도록 한다.

(2) switch-case문

기존에 중복으로 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);을 사용해 종료해야한다.


이렇게 변경하니 훨씬 깔끔하고 보기 좋은 코드가 될 수 있었다... 🥹

profile
@lim_128

0개의 댓글