내배캠 TIL 18일차

오병택·2025년 3월 13일

내배캠

목록 보기
40/73

학습 요약

도전 lv1 키오스크, 코드 리뷰, 트러블 슈팅

도전 lv1 키오스크

Kiosk 클래스

package com.example.kiosk;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private final Scanner sc;
    private final ShoppingCart shoppingCart;
    private final List<Menu> Menulist;
    private Menu menu;
    private int chooseChildMenu;

    public Kiosk () {
        sc = new Scanner(System.in);
        shoppingCart = new ShoppingCart();
        Menulist = new ArrayList<>();
        Menulist.add(new Menu("Burgers"));
        Menulist.add(new Menu("Drinks"));
        Menulist.add(new Menu("Desserts"));
    }

    public void start() {
        while (true) {
            System.out.println();

            // 메인 메뉴 시작
            System.out.println("[ MAIN MENU" + " ]");
            for (int i = 0; i< Menulist.size(); i++) {
                System.out.println(i+1+"." + " " +Menulist.get(i).getCategory());
            }
            System.out.println("0. 종료      | 종료");
            System.out.println();
            int chooseParentMenu = io("메뉴를 선택해주세요 : ",0,3);
            if (chooseParentMenu == 0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else {
                menu = Menulist.get(chooseParentMenu - 1);
                System.out.println("선택한 메인메뉴 :  " + chooseParentMenu + ". " + menu.getCategory());
            }
            System.out.println();

            // 부 메뉴 시작
            System.out.println("[ " + menu.getCategory() + "MENU" + " ]");
            menu.showMenuCategory();
            System.out.println("0. 되돌아가기      | 되돌아가기");
            System.out.println();
            chooseChildMenu = io("메뉴를 선택해주세요 : ",0,4);
            if (chooseChildMenu == 0) {
                System.out.println("되돌아갑니다");
                continue;
            } else {
                System.out.println("선택한 " + menu.getCategory() + "메뉴 :  " + chooseChildMenu + ". " + menu.getMenuItems().get(chooseChildMenu - 1).toString());
                System.out.println();
                System.out.println();
                shoppingCartAddCancel();
            }
            int s = shoppingCartOrderCancel();
            if (s==1) {break;}
        }
    }

    // 입출력 및 예외처리 메서드
    private int io(String choose, int min,int max) {
        while (true) {
            try {
                while (true) {
                    System.out.print(choose);
                    int input = sc.nextInt();
                    if (input>=min && input<=max) {
                        return input;
                    }else {
                        System.out.println("메뉴의 숫자에서만 골라주세요");
                    }
                }
            }catch (InputMismatchException e){
                System.out.println("숫자만 써주세요");
                sc.nextLine();
            }
        }
    }

    // 장바구니 추가 및 취소 기능 메서드
    private void shoppingCartAddCancel() {
        System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).toString());
        System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.println("1. 확인        2. 취소");
        int chooseShoppingCartMenu = io("번호를 선택해주세요 : ", 1, 2);
        if (chooseShoppingCartMenu == 1) {
            MenuItem shoppingCartItemTemp = new MenuItem(
                    menu.getMenuItems().get(chooseChildMenu - 1).getName(),
                    menu.getMenuItems().get(chooseChildMenu - 1).getPrice(),
                    menu.getMenuItems().get(chooseChildMenu - 1).getExplanation(),
                    1
            );
            shoppingCart.addShoppingCartItems(shoppingCartItemTemp);

            // 장바구니에 같은 메뉴가 들어왔을 때 사용
            for (int i = 0; i<shoppingCart.getShoppingCartItems().size()-1; i++) {
                for (int j = i+1; j<shoppingCart.getShoppingCartItems().size(); j++) {
                    if (shoppingCart.getShoppingCartItems().get(i).getName().equals(shoppingCart.getShoppingCartItems().get(j).getName())) {
                        shoppingCart.removeShoppingCartItems(j);
                        shoppingCart.getShoppingCartItems().get(i).setPrice();
                        shoppingCart.getShoppingCartItems().get(i).setCount();
                    }
                }
            }
            System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).getName() + "이 장바구니에 추가되었습니다");
        } else {
            System.out.println("취소되었습니다");
        }
    }

    // 장바구니에 담긴 음식 주문 및 취소 기능 메서드
    private int shoppingCartOrderCancel() {
        if (!shoppingCart.getShoppingCartItems().isEmpty()) {
            System.out.println();
            System.out.println("[ ORDER MENU" + " ]");
            System.out.println("4. Orders       | 장바구니를 확인 후 주문합니다.\n5. Cancel       | 진행중인 주문을 취소합니다.");
            int chooseOrderMenu = io("메뉴를 선택해주세요 : ", 4, 5);
            if (chooseOrderMenu == 4) {
                System.out.println("[ Orders" + " ]");
                double sum = shoppingCart.sumPriceShowShoppingCart();
                System.out.println();
                System.out.println("[ Total" + " ]");
                System.out.println("W " + sum);
                System.out.println();
                System.out.println("1. 주문      2. 메뉴판");
                int chooseOrderAndMenu = io("번호를 선택해주세요 : ", 1, 2);
                if (chooseOrderAndMenu == 1) {
                    System.out.println("주문이 완료되었습니다. 금액은 W " + sum + " 입니다");
                    shoppingCart.clearShoppingCartItems();
                } else {
                    System.out.println("메뉴판으로 되돌아갑니다");
                }
                return chooseOrderAndMenu;
            } else {
                System.out.println("진행중인 주문을 취소했습니다");
            }
        }
        return 0;
    }
}

ShoppingCart 클래스

package com.example.kiosk;

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
    private final List<MenuItem> shoppingCartItems;

    public ShoppingCart() {
        shoppingCartItems = new ArrayList<>();
    }

    // 장바구니 내역 보여주고 합계 계산 메서드
    public double sumPriceShowShoppingCart() {
        double sum = 0;
        for (MenuItem shoppingCartItem : shoppingCartItems) {
            System.out.println(shoppingCartItem.toString());
            sum += shoppingCartItem.getPrice();
        }
        return sum;
    }

    public List<MenuItem> getShoppingCartItems() {
        return this.shoppingCartItems;
    }

    public void addShoppingCartItems(MenuItem menu) {
        this.shoppingCartItems.add(menu);
    }

    public void removeShoppingCartItems(int idx) {
        this.shoppingCartItems.remove(idx);
    }

    public void clearShoppingCartItems() {
        this.shoppingCartItems.clear();
    }
}
package com.example.kiosk;

public class MenuItem {
    private final String name;
    private  double price;
    private final String explanation;
    private int count;

    MenuItem(String name, double price, String explanation) {
        this.name = name;
        this.price = price;
        this.explanation = explanation;
    }
    MenuItem(String name, double price, String explanation, int count) {
        this.name = name;
        this.price = price;
        this.explanation = explanation;
        this.count = count;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice() {
        this.price+=this.price;
    }

    public String getExplanation() {
        return explanation;
    }

    public int getCount() {
        return this.count;
    }

    public void setCount() {
        this.count++;
    }

    @Override
    public String toString() {
        if (this.count == 0) {
            return String.format("%s| W %.1f | %s", this.name, this.price,this.explanation);
        }
        return String.format("%s| W %.1f | %s x %d", this.name, this.price,this.explanation,this.count);
    }
}

어려웠던 부분

  • 내 코드의 생성자 부분을 정확히 이해
  • ShoppingCart 클래스를 ShoppingCartItem 클래스를 만들어서 책임 분리
  • 같은 메뉴를 입력 받았을 때 메뉴를 삭제하고 수량을 증가시키는 부분

해결 방법

  • 튜터님을 찾아갔지만 그래도 이해를 못했고 계속 집중해서 생각해보다가 객체의 흐름에 대해 그림을 계속 그리다가 해결
  • 클래스 책임 분리에 대해 생각하다가 MenuItem클래스처럼 만들면 되겠다해서 참고해서 만들었는데 MenuItem클래스와 겹치는 부분이 많은 것 같아서 ShoppingCartItem의 기능을 MenuItem에 추가해서 동작하게 만들었다. 최종적으로는 ShoppingCartItem은 삭제했고 ShoppingCart와 MenuItem클래스를 연결지었다.
  • 분명 같은 값을 받고 있는데 equals로 비교해봐도 계속 false가 나오길래 알고 보니 객체 주소가 달라서 그런 것이였다. 하지만 equals 오버라이딩을 해야 하나하고 튜터님에게 찾아가서 equals를 오버라이딩해야 하냐고 물으니 그냥 객체 비교를 하지 말고 getter로 이름이 같으면 true 나오게 바꿔주면 좋을 것 같다고 하셔서 바로 적용하고 해결했다.

코드 리뷰

팀원분들이 말해주신 개선 사항✔

  • Map 사용하면 좋을 것 같다.
  • 장바구니에 같은 메뉴가 들어오게 되는 부분 좀 더 간결하게 했으면 좋겠다.
  • 매개변수로 처리하기 child변수. 매개변수로 받으면 child-1 뺄 수 있음.

느낀 점

내 코드가 어떻게 작동하는 지는 알겠는데 그것이 정확히 왜? 이렇게 되는지 알고 코드를 짜고 싶어서 코드카타가 끝난 이후 생성자 부분이 이해될 때까지 들여다보고 그림으로 그리면서 하다가 이해를 했다. 이해를 못했다면 아마 오늘 제대로 된 코딩을 시작 못했을 수도 있겠다는 생각에 아찔했다.😂 그런 다음 집중이 잘 돼서 내 나름대로 만족할 만한 리팩토링을 하고 lv2로 넘어갔다. 오늘은 어제처럼 시간이 아깝지 않았다고 생각한 날인 것 같다. 😎👍 이제 친해졌는데 새로운 팀이라니.. 모두들 화이팅!

profile
걱정하지 말고 일단 해봐!

0개의 댓글