본문 바로가기
스파르타 내일배움캠프/TIL(Today I learned)

25.03.13 TIL - Lv3. 키오스크 과제

by pandastic 2025. 3. 13.
반응형

 

 

목차

     

     

    Lv 3. 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기

    1. 요구사항

    • Kiosk 클래스 생성하기
      • 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
      • MenuItem을 관리하는 리스트가 필드로 존재합니다.
      • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
      • List<MenuItem> menuItems 는 Kiosk 클래스 생성자를 통해 값을 할당합니다.
        • Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.

     

    • 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
      • 콘솔에 햄버거 메뉴를 출력합니다.
      • 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
      • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
      • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.

     

    2. 트러블 슈팅(문제 해결)

    1. 문제 상황

    • InputMismatchException 이 일어날 경우, 오류 메시지 출력 후 다시 입력할 수 있도록 진행되어야하는데 그렇게 되지 않았다.

     

    2. 해결 과정

    • input.nextLine(); 을 이용해서 버퍼를 비워주었더니 해결되었다.

     

    3. 문제 발생 이유

    • 입력 후 Enter를 칠 때 Enter의 값이 남아있는데 그게 자동으로 값이 넘어가는 것이었다.

     

    [해결한 코드]

    try {
        select = input.nextInt();
    } catch(Exception e) {
        System.out.println("숫자를 입력해주세요!");
        // 버퍼를 비워서 select에 들어간 값을 비워줘야함.
        input.nextLine();
        continue;
    }

     

     

     

    3. 전체 코드

    더보기
    더보기
    더보기

    Kiosk.java

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Kiosk {
    
        // 속성
        private final List<MenuItem> menuItems;
    
        // 생성자
        public Kiosk(List<MenuItem> menuItems){
            this.menuItems = menuItems;
        }
    
        // 기능
        public void start() {
    
            Scanner input = new Scanner(System.in);
    
            // 선택한 메뉴를 담을 list
            List<String> selectList = new ArrayList<>();
    
            // while문 break 용도
            boolean check = true;
    
            while (check) {
    
                // 메뉴 출력
                System.out.println("[ SKY COFFEE MENU ]");
                for (int i = 0; i < menuItems.size(); i++) {
                    System.out.println(i + 1 + ". " + menuItems.get(i).toString());
                }
    
    
                System.out.print("메뉴를 선택해주세요(종료 시 0 입력): ");
                int select = 0;
    
                try {
                    select = input.nextInt();
                } catch(Exception e) {
                    System.out.println("숫자를 입력해주세요!");
                    // 버퍼를 비워서 select에 들어간 값을 비워줘야함.
                    input.nextLine();
                    continue;
                }
    
                switch (select) {
                    case 1:
                        System.out.println(1 + ". " + menuItems.get(0).getCoffee() + "을 선택하셨습니다.\n");
                        selectList.add(menuItems.get(0).getCoffee());
                        break;
                    case 2:
                        System.out.println(2 + ". " + menuItems.get(1).getCoffee() + "을 선택하셨습니다.\n");
                        selectList.add(menuItems.get(1).getCoffee());
                        break;
                    case 3:
                        System.out.println(3 + ". " + menuItems.get(2).getCoffee() + "을 선택하셨습니다.\n");
                        selectList.add(menuItems.get(2).getCoffee());
                        break;
                    case 4:
                        System.out.println(4 + ". " + menuItems.get(3).getCoffee() + "을 선택하셨습니다.\n");
                        selectList.add(menuItems.get(3).getCoffee());
                        break;
                    case 5:
                        System.out.println(5 + ". " + menuItems.get(4).getCoffee() + "을 선택하셨습니다.\n");
                        selectList.add(menuItems.get(4).getCoffee());
                        break;
                    case 0:
                        System.out.println("프로그램을 종료합니다.");
                        // 선택된 음료가 있을 경우에만 출력
                        if(!selectList.isEmpty()){
                            System.out.println("선택하신 메뉴는 ");
                            // 개선할 필요가 있는 코드.
                            for (String s : selectList) {
                                for (MenuItem menuItem : menuItems) {
                                    if (menuItem.getCoffee().equals(s)) {
                                        System.out.println(menuItem);
                                    }
                                }
                            }
                            System.out.println("입니다.");
                        }else{
                            System.out.println("선택하신 음료가 없습니다.");
                        }
                        // 강제 종료하는 느낌이 강함. break 추천.
                        check = false;
                        break;
                    default:
                        System.out.println("잘못된 번호를 입력하셨습니다!");
                }
            }
        }
    }

     

    MenuItem.java

    public class MenuItem {
    
        // 불변객체 설정
        private final String coffee;
        private final int price;
        private final String info;
    
        // 생성자
        public MenuItem(String coffee, int price, String info){
            this.coffee = coffee;
            this.price = price;
            this.info = info;
        }
    
        // 재정의 없이 toString()을 사용하면 값이 출력되는 게 아니라 메모리 주소가 나오게 됨.
        // 오버라이딩을 이용해 toString() 메서드를 재정의해서 해결할 수 있음.
        // 참고 블로그 : https://velog.io/@wnajsldkf/toString-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
        @Override
        public String toString() {
            return coffee + "   | W " + price + " | " + info;
        }
    
        //불필요한 getter, setter 삭제
        public String getCoffee() {
            return coffee;
        }
    }

     

    Main.java

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
    
            List<MenuItem> menuItems = new ArrayList<>();
            menuItems.add(new MenuItem("Espresso", 2500, "고온ㆍ고압하에서 곱게 간 커피 가루에 물을 가해, 30초 이내에 내린 커피."));
            menuItems.add(new MenuItem("Americano", 3000, "에스프레소에 물을 넣어 연하게 마시는 커피."));
            menuItems.add(new MenuItem("Caffé Latte", 3500, "에스프레소에 따뜻한 우유를 1:2 또는 1:3 정도의 비율로 섞은 커피."));
            menuItems.add(new MenuItem("Caramel Macchiato", 4000, "에스프레소에 캐러멜 소스와 우유를 넣고 우유 거품만 살짝 올린 커피."));
            menuItems.add(new MenuItem("Café Mocha", 4500, "에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피."));
    
            Kiosk kiosk = new Kiosk(menuItems);
            kiosk.start();
        }
    }

     

    3. 기존의 코드에서 수정한 부분

     

     

    반응형