ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개인프로젝트] 키오스크 만들기 피드백
    스파르타코딩클럽/자바 개인프로젝트 - Kiosk 2023. 10. 23. 22:39

    질문리스트

    1.  토핑메뉴 처리의 올바른 방식
    2. 주문목록에서 다른 숫자 입력 시 try-catch가 똑바로 되어있는지
    3. 0번을 눌렀을때 받아오는 총 판매목록이 HashSet이라 가끔 순서가 바뀐다.  
      이걸 List로 하면 해결할 수 있을 것 같은데 List로 바꾼다면?
    4. 0번을 눌렀을 때 판매된 메뉴를 출력할때 Iterator를 사용했지만 더 좋은 선택지는 없었을까
    5. 메뉴를 List에 add할때 메인메뉴에서 했는데 이것을 각 메뉴클래스에서 할 수는 없었나
      (첫날 막힌부분)
    6. 고쳐야 할점

     

    1. 토핑메뉴 처리의 올바른 방식

    private void addOrderMainMenu(ArrayList<? extends Menu> menuList, Scanner sc, int choice) {
            System.out.println(menuList.get(choice));
            System.out.println("     주문목록에 담으시겠습니까?");
            System.out.println("       1.네    2.아니오");
            int chooseMenu = sc.nextInt();
            sc.nextLine();
            if (chooseMenu == 1) {
                System.out.println("주문목록에 담았습니다.");
                addOrder(menuList.get(choice), 1);
                System.out.println("\n선택하신 상품에 메뉴를 추가하시겠습니까?");
                System.out.println("원하시는 상품이 없다면 5번을 눌러주세요\n");
                choiceMenu(main.topping);
                plusMenu(main.topping);
            } else {
                System.out.println("취소되었습니다.");
    
            }
        }

    현재는 이런 식으로 코드가 짜여져 있는 상황이었고   메인메뉴만 토핑추가가 있으므로

     

    내용이 거의 중복됨에도 불구하고 addOrderMenu와 addOrderMainMenu  두 메소드로 따로 써야한다는 점이 불만이었음

     

    이를 해결하는 방식으로는 MainMenu , PlusMenu 클래스에서  Boolean 값을 만든 후 하나는 True, 하나는 false로 준다.

     

    이를 pickMenu 파라미터로 추가하여  boolean값으로 T/F에 따라 분기를 만들고 메인메뉴인지 구분가능

     

    이라고 하셨는데  이에 대해선 좀 더 깊은 이해가 필요할 듯 하다..

     

     

     

    2. try-catch 올바른 사용

    try {
            Scanner sc = new Scanner(System.in);
            int orderOk = sc.nextInt();
            sc.nextLine();
    
                if (orderOk == 1) {
                    for (Map.Entry<Menu, Integer> entry : orderMap.entrySet()) {
                        Menu menu = entry.getKey();
                        OrderResult.setSelledMenu(menu);
                    }
                    setTotalSales(totalPrice);
                    endOrder();
                } else if (orderOk == 2) {
                    Menu.printMenu();
                } else {
                    System.out.println("이거 누르시면 안되는데 이번만 봐드립니다!");
                }
            } catch (InputMismatchException e) {
                System.out.println("화면에 있는 숫자를 눌러주세요. 제발ㅠㅠ");
            }
        }

     

    메인메뉴에서 5번을 누르면  현재 담은 메뉴들을 목록으로 출력하게 되는데

     

    여기서 조건을 똑바로 걸어두지 않아서  1,2 외에 다른 숫자를 눌러도 메인메뉴로 돌아가지고

     

    심지어 문자를 입력하면 에러가 뜨기도 하였는데  나는 이걸  제출 직전에 알았다.

     

    그래서 숫자는 else문을 추가하여  경고문을 출력하도록 하였고

     

    문자 등 에러를 불러일으킬만한 것들은 catch문을 사용하여 경고문을 출력하도록 하였다.

     

    다행히도 적절하게 사용했다는 피드백을 받았다!

     

     

     

     

     

     

    3. HashSet을 List로

    public static HashSet<String> getSelledMenu() {
            HashSet<String> selledMenuName = new HashSet<>();
            for (Menu menu : selledMenu) {
                selledMenuName.add(menu.getName()+ "         "+ menu.getPrice()+"원");
            }
            return selledMenuName;
        }

     

    메인메뉴에서 0번을 눌렀을때  판매된 목록이 호출되도록 하는 코드 중의 일부이다.

     

    Map<메뉴명, 갯수>  에서  key값인 메뉴명을 OrderResult 클래스의 ArrayList에 담고  그 List를 바로 출력하려 하였으나

     

    [메뉴1, 메뉴2, 메뉴3]  이렇게 출력 되어서 toString 메소드를 건드리다가 포기했었다.

     

    물론 HashSet을 쓰면 깔끔하게 나오긴 하지만  가끔씩 순서가 뒤엉켜서 나올때가 있었기에 이를 반드시 해결하고 싶었다.

     

    튜터님께서는 상상도 못할 방법으로 간단히 해결해주셨는데

     

    public List<String> sample() {
      ArrayList<String> sampleList = new ArrayList<>();
      
      for (Menu menu : selledMenu) {
          sampleList.add(menu.getName() + "    " menu.getPrice() + "원");
       }
       
       for (String sample : sampleList) {
       		System.out.println("sample = " + sample);
       }
       
       return sampleList;

     selledMenuName.add(menu.getName()+ "         "+ menu.getPrice()+"원");

     

    이 내용을 그대로 문자열로 받아서  list에 넣어버린 것이다.

     

    당연히 list에서 하나를 꺼내면 저것이 꺼내지게 되고,  toString을 할 필요도 없이 for문을 통해 바로 출력하면 끝이다.

     

    생각을 유연하게 할 필요가 있음을 느꼈다.    엄청 쉬운 내용이었는데 너무 어렵게 생각했던 것 같다.

     

     

     

    4. Iterator은 옳은 코드인가

    if (select == 0) {
            System.out.println("현재까지 판매된 메뉴는 아래와 같습니다.");
            Iterator it = OrderResult.getSelledMenu().iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }
            System.out.println("\n총 판매액  " +OrderResult.getTotalSales() +"원");
            System.out.println("\n고객이 사용하는 기능이 아니기 때문에 메뉴판은 자동으로 출력되지 않습니다.");
            System.out.println("1 2 3 5 6을 눌러 이동해주세요.");
           }

     

    0번을 출력하는 main 메뉴이다.

    보면 위 5번에서 받은 데이터를 iterator를 사용해서 출력함을 알 수 있는데 

    이것보다 더 좋은 코드가 있을것 같아 이에 대해 질문하였다.

     

    물론 더 좋은 방식이 있으며 스트림을 사용하면 되는것이라고 하셨으며, 단순히 for문을 활용하여도 된다고 하셨다.

     

    // Stream 사용     (그렇지만 iterator가 있긴 함)
    OrderResult.getSelledMenu().stream().forEach(it -> System.out.println("it = " + it));
    
    
    //for문 
    for (String selledMenu : OrderResult.getSelledMenu()) {
    System.out.println("selledMenu = " + selledMenu);
    }

     좀 더 열심히 자바를 공부해야겠다는 다짐과 함께  

    내가 가진 지식을 좀 더 잘 활용했더라면 어땠을까 하는 두가지 감정을 느낀 답변이었다.

     

     

     

     

    5. main 클래스 대신 각 메뉴클래스에서 list.add() 할 수는 없었나

     food.add(new MainMenu("로제떡볶이", 15000, "원픽 떡볶이"));

    main클래스를 보면 저런 코드가 10줄이 넘게 들어가 있다.

    꽤나 보기 싫었기에 처음엔 각 메뉴클래스에서 list에 add한 다음  메인클래스로 따로 가져오려 했으나

    모든 방식이 에러가 떴기에 포기하고 완성한 다음  이에 대해 질문하였다.

     

    넣는방식은 

     

    각 메뉴클래스에서 List를 생성한 다음

    생성자를 통해

    생성자 {

     food.add(new MainMenu("로제떡볶이", 15000, "원픽 떡볶이"));

    }

     

    이런 형식으로 집어넣는 것이었다.

     

    내가 main에 때려박은 것과  이 방식의 차이점은  추후 메뉴의 수정/삭제가 필요한 경우 

    내 코드는 하드코딩해야하지만 이 방식은 메소드 하나만 추가하면 바로바로 수정/삭제가 가능하다는 점에서

    유지보수가 쉬워진다고 하셨다.

     

     

     

     

     

    6. 고쳐야할 점 

    마지막으로 코드를 보신 후에 이건 좀 고쳤으면 좋겠다 하는 부분이 있는지 여쭤보았다.

    생각보다 간단하지만 어려운 문제였는데

     

    코드를 다 작성한 후 정렬하기

    적절히 줄바꿈하여 가독성 올리기

     

    협업을 위해서는 이 부분이 정말 중요하다는 말씀까지 덧붙이면서 이 부분을 지적해주셨다.

    친구에게도 이 부분을 지적받았던 터라 생각보다 데미지가 들어왔고, 앞으로 코드를 칠때마다

    이를 상기하면서 쳐야겠다는 생각이 든다.

     

     

     

     

    팀프로젝트가 끝나면 다시 이 부분을 리뷰하면서 부족한 부분을 다시 고쳐서 더 나은 코드를 만들어 봐야겠다.

Designed by Tistory.