내배캠 TIL 17일차

오병택·2025년 3월 12일

내배캠

목록 보기
39/73

학습 요약

도전 lv1 키오스크 아직도 ing (〒▽〒)

도전 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 = new Scanner(System.in);
    private final ShoppingCart shoppingCart = new ShoppingCart();
    private final List<Menu> Menulist = new ArrayList<>();
    private Menu menu;
    private int chooseChildMenu;

    public Kiosk () {
        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) {
            ShoppingCart shoppingCartTemp = new ShoppingCart(
                    menu.getMenuItems().get(chooseChildMenu - 1).getName(),
                    1,
                    menu.getMenuItems().get(chooseChildMenu - 1).getPrice()
            );
            shoppingCart.addShoppingCart(shoppingCartTemp);
            System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).getName() + "이 장바구니에 추가되었습니다");
        } else {
            System.out.println("취소되었습니다");
        }
    }

    // 장바구니에 담긴 음식 주문 및 취소 기능 메서드
    private int shoppingCartOrderCancel() {
        if (!shoppingCart.getShoppingCart().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 = 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.clearShoppingCart();
                } else {
                    System.out.println("메뉴판으로 되돌아갑니다");
                }
                return chooseOrderAndMenu;
            } else {
                System.out.println("진행중인 주문을 취소했습니다");
            }
        }
        return 0;
    }

    // price 합계 계산 및 장바구니에 담긴 음식 출력 메서드
    private double sumPriceShowShoppingCart() {
        double sum = 0;
        for (int i = 0; i < shoppingCart.getShoppingCart().size(); i++) {
            System.out.println(shoppingCart.getShoppingCart().get(i).toString());
            sum += shoppingCart.getShoppingCart().get(i).getPrice();
        }
        return sum;
    }
}

ShoppingCart 클래스

package com.example.kiosk;

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

public class ShoppingCart {
    private final List<ShoppingCart> shoppingCartlist = new ArrayList<>();
    private  String name;
    private  int count;
    private  double price;

    public ShoppingCart() {

    }

    public ShoppingCart(String name, int count, double price) {
        this.name=name;
        this.count=count;
        this.price=price;
    }

    public String getName() {
        return this.name;
    }

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

    public double getPrice() {
        return this.price;
    }

     public void addShoppingCart(ShoppingCart menu) {
        this.shoppingCartlist.add(menu);
     }

     public List<ShoppingCart> getShoppingCart() {
         return this.shoppingCartlist;
     }

    public void clearShoppingCart() {
        this.shoppingCartlist.clear();
    }

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

트러블슈팅

어려웠던 부분

  • 쇼핑카트의 멤버변수와 생성자를 아예 사용하지 않고 실행되게 만들어서 쇼핑카트와 연결되게끔 리팩토링을 했는데 너무 많은 곳에서 원하는 출력이 안 나오게 된 부분
  • 중복 메뉴인 경우 추가되지 않고 수량 증가시키는 부분
  • (롤백 하고 난 뒤) 합계 계산 해주는 부분

원인

  • 클래스 분리함에 있어서 코드에 대한 경험 부족으로 어떤 식으로 해야 할지 감이 안 잡혀서 마구잡이로 짜다보니 중간중간 테스트를 안한 게 큰 것 같다.
  • 이 부분은 위의 원인으로 인해서 안 된 것 같다.
  • 합계 계산 부분에서 getPrice()가 안 된 이유는 쇼핑카트 클래스의 인스턴스 변수를 초기화 해주지 않아서 0을 계속 반환한 것 같다.

해결 방법

  • 어떻게든 살려보려고 노력을 했으나 롤백하고 새로.. ┗|`O′|┛ ┌( ಠ_ಠ)┘ 이게 해결 방법이 맞냐고? 묻지마 깨문다.
  • 위의 문제를 해결하고 나서는 쉽게 해결됨.
  • 튜터님에게 달려감 👍 생각보다 간단하게 처리됨.

그 후

거의 하루종일 짠 코드를 롤백할 때의 스트레스를 기억하며 이제부턴 코드를 짤 때 중간 중간 테스트를 자주 자주 하고 조금씩 개발하고 커밋하는 습관을 들여야겠다고 생각했다.

튜터님이 말씀하신 개선사항

  • 필드에는 객체 생성을 하지말고 생성자를 통해 초기화 해주는 것이 좋다
  • 클래스는 한 책임만 가지는 게 좋다
    가 있었다. 시간이 남으면 리팩토링을 해보면 좋을 것 같다고 하셨다. 도전은 하겠지만 끝낼 수 있을지는 장담 못한다..

느낀 점

예.. 맞습니다. 저는 오늘 하루가 사라졌습니다. 무지막지하게 어떻게든 쇼핑카트 멤버 변수와 생성자를 쓰려고 코드를 짠 탓에 테스트를 까먹었습니다. 🙌 테스트를 까먹은 채로 중복 메뉴일 때 수량 증가시키는 부분도 만들어버려서 함께 말아먹었습니다.🙌 롤백하고 나니 멍해지네요.. 그래도 어제 코드에서 기능을 메서드로 분리시키고 toString도 오버라이딩 했으니 이룬 게 있긴 합니다. 이룬 거 맞죠?😭

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

0개의 댓글