Light Blue Pointer
본문 바로가기
Developing/Journal

[내일배움캠프][Team Project]키오스크 개발일지

by Greedy 2023. 10. 30.

https://github.com/minisundev/Kiosk

 

GitHub - minisundev/Kiosk: Kiosk program for a burger place

Kiosk program for a burger place. Contribute to minisundev/Kiosk development by creating an account on GitHub.

github.com

개발하면서 생각한 것

나를 포함해서 팀원들끼리 다소 소통이 안 되었구나 하는걸 느꼈다

코드를 실시간으로 확인하고 피드백하는 과정이 있었으면 좀 더 수정할 게 적었을 거 같은데 나는 내가 코드만 대충 짜 놓으면 남들이 찰떡같이 알아듣고 잘 이용할 줄 알았다 그게 아니라는걸 이번에 깨달았다

그리고 저번에 튜터님이 내가 개행을 다소 이상하게 해서 코드가 읽기 힘들다고 하거나 팀플 시작하기 전에 팀원들이랑 누구 코드를 바탕으로 올릴지 코드 리뷰를 할 때 팀원들이 내 코드를 이해하기 힘들다고 처음에는 다른 팀원의 코드를 선택한 것에서  내 코드의 가독성을 직/간접적으로 피드백받았다

그래서 내 코드의 가독성을  올릴 방법을 생각해 봐야겠다고 생각했다

일단 개행과 네이밍은 좀 신경쓰기 시작했는데 필요한 부분에 주석을 적절하게 다는 등 더 이해하기 편하게 할 방법을 찾아보고 클린 코드 책도 읽어봐야겠다고 생각한다

며칠전에 내가 맡은 부분 할 때 코드를 많이 수정했지만 아직도 코드가 다소 지저분하게 느껴진다

 

그리고 팀원이 다 내성적이라고 해도 나라도 말을 하고 추진해서 매일 저녁 코드리뷰하는 시간은 꼭 가져야겠다고 결심했다

매일 저녁 서로 짠 코드를 보며 리뷰하는 시간을 가졌다면 우리가 겪은 대다수의 문제는 발생하지 않았을 것이다

과제 초반에 내가 해놓은 일들에 대해서 다른 팀원들이 저걸 무슨 생각으로 만들어 놨구나 하고 이해를 더 잘 하거나, 변수명이 마음에 들지 않는다는 등의 지적을 해서 내가 그걸 초장에 고치고 모두가 이해하기에 좋은 코드가 되었거나, 요구사항을 완전히 구현하지 않고 산으로 간 팀원이 있었다면 빨리 지적해서 그 문제를 초기에 파악하고 해결할 수 있었을 것 같다.

또한 문제를 겪고 있는 팀원이 있으면 알고있는 선에서 빨리 도움을 줘서 기능을 빨리 구현하고 코드를 보완하고 수정하는데 더 많은 시간을 투자하거나 퀄리티를 개선하는 작업까지 진행할 수 있지 않았나 싶다.

분업을 딱 하고 시작하고 소통은 잘 되지 않아서 저 문제가 극대화되었는데 어떻게든 요구사항은 구현한 채로 팀플이 끝났지만 서로 소통하면서 발생하는 상호작용으로부터 함께 발전하는 등 팀프로젝트의 긍정적인 의미는 다소 없었던 것 같다.

저번 팀 프로젝트에서 느낀 거지만 팀원이 문제 상황을 공유해주고 나도 함께 고민하는 과정도 나의 성장에 도움이 되는 기회인 것 같다.

다음 팀 프로젝트를 할 때부터는 뭔가 막히는 것이 있으면 질문하라거나 하는 식으로 두루뭉술하게 말하지 말고 매일 저녁에 코드리뷰는 꼭 하자고 해서 자연스럽게 어떤 팀원이 막히는 부분을 모두가 알게 되는 방식으로 팀프로젝트가 수행되는 편이 좋겠다고 생각한다.

또 내 코드에서도 개선점을 찾아내준다면 좋겠다고 생각한다

나 혼자 백날 코드 짜봤자 내 경험과 내 분석력의 한계가 내 성장의 한계니까 코드 리뷰는 많이 받을수록 좋다고 생각한다

새로운 시선으로 지적당했을때 나는 생각도 못 해본 부분이고 타당한 부분이면 그 부분 시정하는게 나한테 도움되니까 앞으로는 판이 없으면 내가 만들어서라도 코드 리뷰를 해야겠다

 

오늘의 목표

오늘의 목표는 프로젝트 최종 제출을 위해서 기존 코드를 다소 보완하고 수정하는 것이다

 

public static void printAllProduct(){
        double total = 0;
        System.out.println(
                "[ 총 판매 목록 ]");
        for (Order o : orders) {
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                total = total + p.getPrice()*p.getCount();
            }
        }
        System.out.println("[ Total ]\nW " + total);
    }

이렇게 되고 있는데

public static List<Order> orders = new ArrayList<Order>();//현재 주문 저장
    public static List<Order> waitingOrders = new ArrayList<Order>();//대기 주문 저장
    public static ArrayList<Order> completedOrders = new ArrayList<Order>();//완료된 주문 저장

나는 orders를 개인과제할때 현재 주문 == 대기주문이라고 생각하고 orders는 기존의 것을 사용한다는 생각으로 completeOrders만 추가로 만들어놨으나

다른 팀원이 맡은 부분을 구현하면서 대기주문을 저장하는 waitingOrders ArrayList를 만들어 놓았다

대기주문이랑 완료주문이랑 총 주문 저장하는게 다 따로따로 있으면 저장공간을 중복해서 사용하게 되니까 하나를 삭제하는게 좋다고 생각했다

그런데 대기주문을 칭할때 waiting이 붙는 편이 이름이 명확하다고 생각해서 내가 기존에 만들어둔 orders ArrayList 를 삭제하는 쪽으로 코드를 바꿨다

public class Order {
    public ArrayList<Product> instanceMenus;
    private String offer = "";
    private double total = 0;
    private String time;
    private int waitingNum;
    private String completeTime;
    public Order() {
    }

그리고 waitingNum이 그냥 waitingOrders 의 size이면 될 거 같은데 객체마다 하나씩 들어있는게 이상해서 저 필드 삭제했다

 

private static int waiting = 0;//대기인원 -> orders.size()로 하면 될듯함

    public static int getWaiting() {
        return waiting;
    }

    public static void decreaseWaiting() {
        waiting = waiting - 1;
    }

    public static void increaseWaiting() {
        waiting = waiting + 1;
    }

이거 사이즈로 하려고 그냥 삭제했다

주문시 increaseWaiting 하는거 그냥 삭제

System.out.println("주문이 완료되었습니다!\\n\\n" +
                        "대기번호는 [ " + getWaiting() + " ] 번 입니다.\\n" +
                        "(3초후 메뉴판으로 돌아갑니다.)");
                //3초 기다려야됨

이거 바꿈

System.out.println("주문이 완료되었습니다!\\n\\n" +
                        "대기번호는 [ " + waitingOrders.size() + " ] 번 입니다.\\n" +
                        "(3초후 메뉴판으로 돌아갑니다.)");
                //3초 기다려야됨

그러고 한참 후에 코드를 자세히 보니까 주문 완료를 Order객체에 저장된 waitingNum으로 하고있어서 다시 복구했다 ㅋ

그리고 또 생각해보니 대기번호가 은행이나 식당 대기번호처럼 불러주는거면 하루동안 누적되는게 맞는 거 같다

대기주문 사이즈가 줄었다 늘었다 하는데 똑같은 번호 불리면 혼란스러울 거 같아서 다시 저 필드 생성했다

increaseWaiting();
                System.out.println("주문이 완료되었습니다!\\n\\n" +
                        "대기번호는 [ " + getWaiting() + " ] 번 입니다.\\n" +
                        "(3초후 메뉴판으로 돌아갑니다.)");
                //3초 기다려야됨
for (Product p : cart) {
                    Product product = new Product(p.getName(), p.getDesc(), p.getPrice(), p.getCount());
                    Order order = new Order();
                    order.instanceMenus = new ArrayList<Product>();
                    order.instanceMenus.add(product);
                    order.setTotal(total);
                    order.setOffer(request);//주문에 요청사항 추가
                    order.setTime(dateTimeNow);
                    **order.setWaitingNum(getWaiting()); -> size로 하면 자동으로 되어서 뺐었는데 다시 추가**
                    waitingOrders.add(order);//대기주문에 추가
                }

그리고 요구사항에 이렇게 써있는데

(신규)주문 현황

  • 맨 위에 완료된 최근주문 3개를 출력한다.
  • 그 아래에 대기중인 모든 주문 목록을 출력한다.

[ ORDER MENU ]

5. Order | 장바구니를 확인 후 주문합니다.

6. Cancel | 진행중인 주문을 취소합니다.

7. WaitingOrder | 대기중인 주문목록을 확인합니다.

8. RecentOrder | 최근 3가지 주문목록을 확인합니다.

9. Exit | 주문 앱에서 나갑니다.

팀원이 이렇게 했길래

(i + 2) + ". Recent Orders       | 주문 현황을 확인합니다.\\n" +

else if (menu == (menus.size() + 3)) {//주문 현황
                recentOrder();
                waitingOrder();

이렇게 수정함

최근 완료 주문이라는 거 알려주는 문구 넣고

public static void recentOrder(){//완료된 최근주문 3개 출력
        System.out.println(
                "[ 최근 완료 주문 ]");
        if(completedOrders.size()>3) {
            for (int i=completedOrders.size()-1; i> completedOrders.size()-4; i--) {
                Order o = completedOrders.get(i);
                    for (Product p : o.instanceMenus) {
                        p.printDescTotal();
                    }
                }
            }
        else{
            for (Order o : completedOrders) {
                for (Product p : o.instanceMenus) {
                    p.printDescTotal();
                }
            }
        }

이건 장바구니 뽑고 있길래 요구사항에 맞게 대기주문 뽑는걸로 바꿨다.

public static void waitingOrder(){
        for (Product p : cart) {
            p.printDescTotal();
        }
    }

이렇게

public static void waitingOrder(){
        System.out.println(
                "[ 현재 대기중인 주문 ]");
        for (Order o : waitingOrders) {
            for(Product p : o.instanceMenus) {
                p.printDescTotal();
            }
        }
    }

 

그리고 총 주문을 뽑을떄 내가 전에 작성했던 코드 orders 대신 두 waiting,completed Orders ArrayList 쓰게 바꿈

public static void printAllProduct(){
        double total = 0;
        System.out.println(
                "[ 총 판매 목록 ]");
        for (Order o : waitingOrders) {
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                total = total + p.getPrice()*p.getCount();
            }
        }
        for (Order o : completedOrders) {
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                total = total + p.getPrice()*p.getCount();
            }
        }
        System.out.println("[ Total ]\\nW " + total);
    }

[ 최근 완료 주문 ]

[ 현재 대기중인 주문 ]

ShackBurger | W 6.9 | 3개 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거

SHAKESHACK BURGER 에 오신걸 환영합니다.

이렇게 나오는데 빈 공간이 나오는게 좀 그래서

완료주문이 비었을 경우 없다는 코드 출력하도록 수정함

public static void recentOrder(){//완료된 최근주문 3개 출력
        System.out.println(
                "[ 최근 완료 주문 ]");
        if(completedOrders.size()>3) {
            for (int i=completedOrders.size()-1; i> completedOrders.size()-4; i--) {
                Order o = completedOrders.get(i);
                    for (Product p : o.instanceMenus) {
                        p.printDescTotal();
                    }
                }
            }
        else if(completedOrders.size()==0){
            System.out.println(
                    "  최근 완료 주문이 없습니다.  ");
        }
        else{
            for (Order o : completedOrders) {
                for (Product p : o.instanceMenus) {
                    p.printDescTotal();
                }
            }
        }
    }
public static void waitingOrder(){
        System.out.println(
                "[ 현재 대기중인 주문 ]");
        if(waitingOrders.size()==0){
            System.out.println(
                    "  현재 대기중인 주문이 없습니다.  ");
        }
        else{
            for (Order o : waitingOrders) {
                for(Product p : o.instanceMenus) {
                    p.printDescTotal();
                }
            }
        }
    }

[ 최근 완료 주문 ]

최근 완료 주문이 없습니다.

[ 현재 대기중인 주문 ]

ShackBurger | W 6.9 | 4개 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거

근데 생각해보니 현재 대기중인 주문에도 대기중인 주문 안의 상품목록만 다 나오는게 아니라 주문당 대기번호가 나오는게 맞는 거 같아서 코드 수정함

public static void waitingOrder(){
        System.out.println(
                "[ 현재 대기중인 주문 ]");
        if(waitingOrders.size()==0){
            System.out.println(
                    "  현재 대기중인 주문이 없습니다.  ");
        }
        else{
            for (Order o : waitingOrders) {
                for(Product p : o.instanceMenus) {
                    p.printDescTotal();
                }
            }
        }
    }

이거였는데

이걸로 수정함

public static void waitingOrder(){
        System.out.println(
                "[ 현재 대기중인 주문 ]");
        if(waitingOrders.size()==0){
            System.out.println(
                    "  현재 대기중인 주문이 없습니다.  ");
        }
        else{
            printWatingList(waitingOrders);
        }
    }

    public static void printWatingList(ArrayList<Order> orders){
        for (Order o : orders) {
            System.out.println("  [ 대기번호 ] "+o.getWaitingNum());
            for(Product p : o.instanceMenus) {
                p.printDescTotal();
            }
            System.out.println("------------------------------");
        }
    }

완료 주문목록 최근 3개 출력도 대기번호 나오게 바꿈

public static void recentOrder(){//완료된 최근주문 3개 출력
        System.out.println(
                "[ 최근 완료 주문 ]");
        if(completedOrders.size()>3) {
            for (int i=completedOrders.size()-1; i> completedOrders.size()-4; i--) {
                Order o = completedOrders.get(i);
                System.out.println("   대기번호 : "+o.getWaitingNum());
                    for (Product p : o.instanceMenus) {
                        p.printDescTotal();
                    }
                }
            System.out.println("------------------------------");
            }
        else if(completedOrders.size()==0){
            System.out.println(
                    "  최근 완료 주문이 없습니다.  ");
        }
        else{
            for (Order o : completedOrders) {
                System.out.println("   대기번호 : "+o.getWaitingNum());
                for (Product p : o.instanceMenus) {
                    p.printDescTotal();
                }
                System.out.println("------------------------------");
            }
        }
    }

상품 삭제도

4

[ 상품 삭제 ]

삭제할 상품의 ID를 입력해 주세요

다짜고짜 이러는거 좀 웃겨서 id랑 상품목록 출력하게 수정함

private static void deleteProduct() {
        Scanner sc = new Scanner(System.in);
        Menu.printId(KioskApp.menus); -> 이거 추가함
        System.out.println("\\u001B[32m[ 상품 삭제 ]\\n" +
                "삭제할 상품의 ID를 입력해 주세요\\u001B[0m"
        );
        String productId = sc.nextLine();
        Boolean removeCheck = Product.deleteProduct(productId);
        if (removeCheck) {
            System.out.println("\\u001B[34m해당상품이 삭제되었습니다\\u001B[0m");
        } else {
            System.out.println("\\u001B[31m해당상품은 상품목록에 없습니다\\u001B[0m");
        }
    }
public static void printId(ArrayList<Menu> menus) {
        for(Menu m:menus){
            System.out.println("\\n [ "+m.getName()+" ]");
            for(Product p: m.products){
                System.out.println(p.getName() + "   | id : " + p.getId());
            }
        }
    }

 

과제에

  • 새로 생성된 메뉴와 상품은 각각 유일한 메뉴ID, 상품ID 식별자를 가진다.

이렇게 되어있는데 상품 삭제 맡은 사람이 product id에 메뉴 id까지 넣어버림

public Menu(String name, String desc) {
        this.name = name;
        this.desc = desc;
        this.products = new ArrayList<Product>();
        this.id = "Menu"+products.size();
    }

Menu id는 내가 형식만 만들어뒀을 때부터 이렇게 넣고 있었는데 아직도 id값을 넣는게 없고 productId에 메뉴이름이랑 상품이름이 다 같이 들어갔다

그래서 Menu id를 따로 써야할 거 같다고 생각했다

public Menu(String name, String desc, String id) {
        this.name = name;
        this.desc = desc;
        this.products = new ArrayList<Product>();
        this.id = id;
    }
public static void createMenu(String name, String desc){
        ArrayList<Menu> menus =KioskApp.menus;
        boolean newMenus = true;
        for (int i=0;i<menus.size();i++){
            if(menus.get(i).getName().equals(name)){
                newMenus = false;//새 메뉴가 아님
                System.out.println("이미 존재하는 메뉴입니다.");
            }
        }
        //for문을 도는 동안 같은 메뉴이름인게 안 나왔으면 새 메뉴임
        if(newMenus){
            **menus.add(new Menu(name,desc,"#"+menus.size()));**
        }
    }
//새로 상품 추가할때
    public static void createProduct(String menuName, String productName, String productDesc, double price) {
        ArrayList<Menu> menus =KioskApp.menus;
        Product product = new Product(productName,productDesc,price,0);
        boolean newMenus = true;
        
        for (int i=0;i<menus.size();i++){
            if(menus.get(i).getName().equals(menuName)){
                product.setId(menuName + "#" +productName);
                menus.get(i).products.add(product);
                newMenus = false;//새 메뉴가 아님
                break;
            }
        }
        //for문을 도는 동안 같은 메뉴이름인게 안 나왔으면 새 메뉴임
        if(newMenus){
            System.out.println("메뉴 설명을 입력해 주세요");
            Scanner sc = new Scanner(System.in);
            String menuDesc = sc.nextLine();
            Menu menu = new Menu(menuName,menuDesc,"#"+menus.size());
            **product.setId(menuName + "#" + productName);**
            menu.products.add(product);
            menus.add(menu);
        }
    }

메뉴 id 다 수정하고 생각해보니 나중에 순서 안 지키고 삭제된다 하면 size가 줄어들었다 늘어나니까 id가 고유하지 않을 것 같았다

이름으로 하면 고유하긴 할 거 같은데 더 id스러운 방법을 찾고 싶어서 구글링했다

How to auto generate unique id in java?

You can use it to generate a random number, which can then be used as a unique ID:

  1. import java.security.SecureRandom;
  2. public class Main {
  3. public static void main(String[] args) {
  4. SecureRandom random = new SecureRandom();
  5. long id = random.nextLong();
  6. System.out.println(id); // prints a random long integer.
  7. }
  8. }

프로덕트 id 다 수정

product.setId(menuName + "#" +productName);

이렇게 되어있던 것을

product.setId("" +random.nextLong());

이렇게 바꿈

Menu 생성할때 id 도 수정함

Menu / createMenu{

if(newMenus){
            menus.add(new Menu(name,desc,""+random.nextLong()));
        }
createProduct{
Menu menu = new Menu(menuName,menuDesc,""+random.nextLong());

 그리고 삭제부분 id이용하게 바꿨음

public static Boolean deleteProduct(String productId) {
        ArrayList<Menu> menus = KioskApp.menus;
        String menuName = productId.split("#")[0];
        String productName = productId.split("#")[1];
        Boolean removeCheck = false;
        for (int i = 0; i < menus.size(); i++) {
            if (Objects.equals(menus.get(i).getName(), menuName)) { // 같은 메뉴
                for (int j = 0; j < menus.get(i).products.size(); j++) {
                    int productIdx;
                    if (Objects.equals(menus.get(i).products.get(j).getName(), productName)) { // 같은 상품
                        productIdx = j;
                        menus.get(i).products.remove(j);
                        removeCheck = true;
                        break;
                    }
                }
                // 메뉴안에 모든 상품이 삭제된 경우 해당 메뉴도 삭제
                if (menus.get(i).products.isEmpty()) {
                    menus.remove(i);
                }
            }
            if (removeCheck) break; // 불필요한 반복문 중지
        }
        return removeCheck;
    }

이렇게 바꿈

public static Boolean deleteProduct(String target) {
        ArrayList<Menu> menus = KioskApp.menus;
        String menuId = target.split("#")[0];
        String productId = target.split("#")[1];
        Boolean removeCheck = false;
        for (int i = 0; i < menus.size(); i++) {
            if (Objects.equals(menus.get(i).getId(), menuId)) { // 같은 메뉴
                for (int j = 0; j < menus.get(i).products.size(); j++) {
                    int productIdx;
                    if (Objects.equals(menus.get(i).products.get(j).getId(), productId)) { // 같은 상품
                        productIdx = j;
                        menus.get(i).products.remove(j);
                        removeCheck = true;
                        break;
                    }
                }
                // 메뉴안에 모든 상품이 삭제된 경우 해당 메뉴도 삭제
                if (menus.get(i).products.isEmpty()) {
                    menus.remove(i);
                }
            }
            if (removeCheck) break; // 불필요한 반복문 중지
        }
        return removeCheck;
    }

 

상품 삭제시 id프린트하는 함수도 수정

public static void printId(ArrayList<Menu> menus) {
        for(Menu m:menus){
            System.out.println("\\n [ "+m.getName()+" ]");
            for(Product p: m.products){
                System.out.println(p.getName() + "   | id : " +m.getId()+"#"+ p.getId());
            }
        }
    }

팀원이 짠 코드가 원래 Menuname+”#”+Productname으로 Product에 id 설정하고 그거를 #으로 쪼개서 받아오는 형식이어서 최대한 코드에 손 안 대고 수정하기 위해서 id출력해서 보여주는 함수에서 #으로 붙여서 나가게 함, 목록에서 복붙하면 되니까!

4

 [ Burger ]
ShackBurger   | id : -2984009651081940793#-5589620155840407411
SmokeShack   | id : -2984009651081940793#-2613803888541952156
Shroom Burger   | id : -2984009651081940793#-7115060433708984134
Cheeseburger   | id : -2984009651081940793#-1252792053427741879
Hamburger   | id : -2984009651081940793#-548386795646805185

 [ Frozen Custard ]
Classic Hand-Spun Shakes   | id : -4425017170463656138#2782784542033497299
Floats   | id : -4425017170463656138#8308900002221545395
Cup & Cones   | id : -4425017170463656138#-2335445662151788680

 [ Drink ]
Raspberry Lemonade   | id : -4939197881360998039#448353365861371010
Lemonade   | id : -4939197881360998039#255489543667572862
Fresh Brewed Iced Tea   | id : -4939197881360998039#1159298147845848298

 [ Beer ]
Lager   | id : -5976661246191413122#6532785234122054125
Ale   | id : -5976661246191413122#3873472969988428682
Abita Root Beer   | id : -5976661246191413122#1032867971681832007
[ 상품 삭제 ]
삭제할 상품의 ID를 입력해 주세요
-4425017170463656138#2782784542033497299
해당상품이 삭제되었습니다

잘 동작했다!

생각해보니 총 판매 목록도 주문마다 나오면 좀 알아보기 쉬울 거 같음

public static void printAllProduct(){
        double total = 0;
        System.out.println(
                "[ 총 판매 목록 ]");
        for (Order o : waitingOrders) {
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                total = total + p.getPrice()*p.getCount();
            }
        }
        for (Order o : completedOrders) {
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                total = total + p.getPrice()*p.getCount();
            }
        }
        System.out.println("[ Total ]\\nW " + total);
    }

이렇게 수정함

public static void printAllProduct(){
        double total = 0;
        System.out.println(
                "[ 총 판매 목록 ]");
        for (Order o : waitingOrders) {
            double totalPerOrder = 0;
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                totalPerOrder = totalPerOrder + p.getPrice()*p.getCount();
            }
            total = total + totalPerOrder;
            System.out.println("W "+totalPerOrder+"\\n------------------------------");
        }
        for (Order o : completedOrders) {
            double totalPerOrder = 0;
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                totalPerOrder = totalPerOrder + p.getPrice()*p.getCount();
            }
            total = total + totalPerOrder;
            System.out.println("W "+totalPerOrder+"\\n------------------------------");
        }
        System.out.println("[ Total ]\\nW " + total);
    }

그러고 나니 똑같은 코드가 반복되는 거 같아서 반복되는 부분 함수로 뽑아냈다

public static void printAllProduct(){
        double total = 0;
        System.out.println(
                "[ 총 판매 목록 ]");
        System.out.println("[ Total ]\\nW " + (Order.printTotal(waitingOrders)+Order.printTotal(completedOrders)));
    }

이걸 뽑아냈더니 저렇게 짧아졌다

public static double printTotal(ArrayList<Order> orders){
        double total = 0;
        for (Order o : orders) {
            double totalPerOrder = 0;
            for (Product p : o.instanceMenus) {
                p.printDescTotal();
                totalPerOrder = totalPerOrder + p.getPrice()*p.getCount();
            }
            total = total + totalPerOrder;
            System.out.println("W "+totalPerOrder+"\\n------------------------------");
        }
        return total;
    }

 

ShackBurger | W 6.9 | 3개 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거

[ Total ] W 13.8

total이 잘못되었다 이것은 2개가격이지 3개가격이 아니다

public void printDescTotal() {
        System.out.println(getName() + "     | W " + this.getPrice() + " | " +(this.getCount()+1)+ "개 | " + getDesc());
    }

지금보니 count를 이상하게 쓰고있었는데 setCount 하는 부분에서 걍 +1하는게 좋겠음

public static void confirmMenu(Product product) {
        while (true) {
            Scanner sc = new Scanner(System.in);
            System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?\\n" +
                    "1. 확인        2. 취소");
            int confirm = sc.nextInt();
            if (confirm == 1) {
                product.increaseCount();//산다 하면 물품 개수만 올려준다 동일한 이름으로 생성 x
                boolean newMenu = true;
                for (Product p : cart) {
                    if(p.getId()==product.getId()){
                        newMenu = false;
                        break;
                    }
                }
                if(newMenu == true){
                    cart.add(product);
                }
                System.out.println(product.getName() + " 가 장바구니에 추가되었습니다.");
                return;
            }else if(confirm == 2){
                return;
            }
        }
    }

찾아보니 setcount는 0으로 초기화할때만 쓰고 increaseCount()쓰고있는데

Q. 왜 잘못되는지 모르겠네?

일단 문제는 파악했으니 되는 방면으로 수정해봄

(p.getCount()+1)

 저렇게 괄호치고 바꾸고 있었는데

생각해보니 그냥 getCount에서 +1 해버리면 되는거 아님?

그랬더니 ShackBurger | W 6.9 | 2개 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거 처음 누르자마자 이렇게 됨

그 이유는 거기만 +1로 수정이 되어있었기 때문이다

public void printDescTotal() {
        System.out.println(getName() + "     | W " + this.getPrice() + " | " +(this.getCount()+1)+ "개 | " + getDesc());
    }

public void printDescTotal() {
        System.out.println(getName() + "     | W " + this.getPrice() + " | " +this.getCount()+ "개 | " + getDesc());
    }

 거기도 +1빼고 이렇게 수정했더니 된다