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

25.03.14 TIL - 키오스크 과제 회고

by pandastic 2025. 3. 14.
반응형

 

 

목차

     

    📱키오스크


    Lv 1. 기본적인 키오스크 프로그래밍

    1. 개발 조건 및 코드

    카페 메뉴 출력 및 선택하기
    • 실행시 카페 메뉴가 표시되고, 이후 Scanner로 숫자를 입력받아서 메뉴를 선택.
    • 제시된 메뉴 중 입력받은 숫자에 따라 다른 로직을 실행하는 코드를 작성.
    • 반복문을 이용해서 특정 번호가 입력되면 프로그램을 종료.

     

    [Lv1. 완성 코드]

    더보기
    package lv1;
    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
    
            while(true){
                System.out.println("[ SKY COFFEE MENU ]\n" +
                        "1. Espresso           | W 2500 | 고온ㆍ고압하에서 곱게 간 커피 가루에 물을 가해, 30초 이내에 내린 커피.\n" +
                        "2. Americano          | W 3000 | 에스프레소에 물을 넣어 연하게 마시는 커피.\n" +
                        "3. Caffé Latte        | W 3500 | 에스프레소에 따뜻한 우유를 1:2 또는 1:3 정도의 비율로 섞은 커피.\n" +
                        "4. Caramel Macchiato  | W 4000 | 에스프레소에 캐러멜 소스와 우유를 넣고 우유 거품만 살짝 올린 커피.\n" +
                        "5. Café Mocha         | W 4500 | 에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피.\n" +
                        "0. 종료      | 종료\n");
    
                System.out.print("메뉴를 선택해주세요: ");
                int select = input.nextInt();
    
                switch(select){
                    case 1:
                        System.out.println("1. Espresso 를 선택하셨습니다.");
                        break;
                    case 2:
                        System.out.println("2. Americano 를 선택하셨습니다.");
                        break;
                    case 3:
                        System.out.println("3. Caffé Latte 를 선택하셨습니다.");
                        break;
                    case 4:
                        System.out.println("4. Caramel Macchiato 를 선택하셨습니다.");
                        break;
                    case 5:
                        System.out.println("5. Café Mocha 를 선택하셨습니다.");
                        break;
                    case 0:
                        System.out.println("프로그램을 종료합니다.");
                        System.exit(0);
                    default:
                        System.out.println("잘못된 번호를 입력하셨습니다!");
                }
            }
        }
    }

     

    Lv 2. 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리하기

    1. 개발 조건 및 코드

    메뉴를 클래스로 관리하기.
    • MenuItem 클래스 생성하기.
    • main 함수에서 MenuItem 클래스를 활용하여 카페 메뉴 출력.
     

     

    [Lv2. 완성 코드]

    더보기

    MenuItem.java

    package lv2;
    
    
    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

    package lv2;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    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, "에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피."));
    
            // 선택한 메뉴를 담을 list
            List<String> selectList = new ArrayList<>();
    
            //Scanner
            Scanner input = new Scanner(System.in);
            while (true) {
    
                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 = input.nextInt();
                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("프로그램을 종료합니다.");
                        System.out.println("선택하신 음료는 ");
    
                        for(String s : selectList){
                            for (MenuItem menuItem : menuItems) {
                                if (menuItem.getCoffee().equals(s)) {
                                    System.out.println(menuItem);
                                }
                            }
                        }
                        System.out.println("입니다.");
    
                        System.exit(0);
                    default:
                        System.out.println("잘못된 번호를 입력하셨습니다!");
                }
            }
    
        }
    }
    

     

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

    과제 진행 중, 2가지 문제가 발생하였다.

     

    [첫번째 이슈]

    1. 문제 상황

    • List의 값을 toString()을 이용하여 출력을 하면 메모리 주소 값만 출력이 되었다.

     

    2. 해결 과정

    • toString() 에 대해서 찾아보니 메서드 오버라이딩을 해주어 해결하는 방법이 있다는 것을 알게 되었다.
    • 아래와 같이 메서드 오버라이딩을 해주어 해결하였다.
    @Override
        public String toString() {
            return coffee + "   | W " + price + " | " + info;
        }

     

     

    3. 문제 발생 이유

    • String, Integer 등은 toString() 사용 시 자신이 가진 값을 그대로 반환한다.
    • ex) menuItems.get(0).getCoffee(); → Espresso 출력.
    • MenuItem은 (String coffee, int price, String info)으로 이루어져있어서 메모리 주소값을 반환하는 것이다.

    (참고한 블로그)

     

    toString() 메서드 올바르게 사용하기

    toString() 사용 방법과 제대로된 사용 용도를 알아보자

    velog.io

     

     

    [두번째 이슈]

    1. 문제 상황

    • 입력되어 있는 커피메뉴보다 많이 선택할 시 java.lang.IndexOutOfBoundsException 오류가 발생했다.

     

    2. 해결 과정

    • 선택한 메뉴를 담는 리스트용 for문,  메뉴 리스트용 for문 2개로 이중 for문을 추가하여 각각의 사이즈에 맞게 설정해주었다.

     

    3. 문제 발생 이유

    • 두 리스트 중 하나의 사이즈에 맞게 지정되어서 생긴 오류였다.

    [해결한 코드]

    for(int j=0; j<selectList.size(); j++){
         for(int k=0; k< menuItems.size(); k++){
             if(menuItems.get(k).getCoffee().equals(selectList.get(j))){
                 System.out.println(menuItems.get(k).toString());
             }
         }
     }

     

     

    Lv 3. 순서 제어를 클래스로 관리하기

    1. 개발 조건 및 코드

    Kiosk 클래스 생성하기.
    • 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스.
    • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리.

     

    [Lv3. 완성 코드]

    더보기

    MenuItem.java

    package lv3;
    
    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;
        }
    }
    

     

    Kiosk.java

    package lv3;
    
    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("잘못된 번호를 입력하셨습니다!");
                }
            }
        }
    }

     

    Main.java

    package lv3;
    
    
    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();
    
        }
    
    
    }
    

     

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

    1. 문제 상황

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

     

    2. 해결 과정

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

     

    3. 문제 발생 이유

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

     

    [해결한 코드]

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

     

    LV 4. 음식 메뉴와 주문 내역을 클래스 기반으로 관리하기

    1. 개발 조건 및 코드

    Menu 클래스 생성하기.
    • MenuItem 클래스를 관리하는 클래스.
    • 각 카테고리 내에 여러 MenuItem을 포함함.
    • 여러 커피들을 포함하는 상위 개념 ‘커피’ 같은 카테고리 이름 필드를 가짐.
    • 메뉴 카테고리 이름을 반환하는 메서드 구현.

     

    [Lv4. 완성 코드]

    더보기

    MenuItem.java

    package lv4;
    
    public class MenuItem {
    
        // 불변객체 설정
        private final String item;
        private final int price;
        private final String info;
    
        // 생성자
        public MenuItem(String item, int price, String info){
            this.item = item;
            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 item + "   | W " + price + " | " + info;
        }
    
        //불필요한 getter, setter 삭제
        public String getItem() {
            return item;
        }
    
        public int getPrice() {
            return price;
        }
        public String getInfo() {
            return info;
        }
    }
    

     

    Menu.java

    package lv4;
    
    import java.util.List;
    
    public class Menu {
    
        // 속성
        private final String category;
        private final List<MenuItem> menuItems;
    
        // 생성자
        public Menu(String category, List<MenuItem> menuItems) {
            this.category = category;
            this.menuItems = menuItems;
        }
    
        // 기능
    
    
        public String getCategory() {
            return category;
        }
    
    
        //메뉴를 순차적으로 보여주는 함수
        public void showMenuItems(){
            for (int i=0; i<menuItems.size(); i++) {
                MenuItem menuItem = menuItems.get(i);
                System.out.println( i + 1 + ". " + menuItems.get(i));
            }
        }
    
        public void pickedItem(int select) {
                MenuItem menuItem = menuItems.get(select);
                System.out.println(menuItem.getItem() + " | " + menuItem.getPrice() + "원 | " + menuItem.getInfo() + "\n");
        }
    
        }

     

    Kiosk.java

    package lv4;
    
    import lv3.MenuItem;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class Kiosk {
    
        // 속성
        private final List<Menu> menus;
    
        // 생성자
        public Kiosk(List<Menu> menus){
            this.menus = menus;
        }
    
    
        Scanner input = new Scanner(System.in);
        // 기능
        public void start() {
    
    
            // while문 break 용도
            boolean check = true;
    
            while (check) {
                // 카테고리 목룍
                System.out.println("[ SKY CAFE ]");
                for (int i = 0; i < menus.size(); i++) {
                    System.out.println(i + 1 + ". " + menus.get(i).getCategory());
                }
                System.out.print("카테고리를 선택해주세요(종료 시 0 입력): ");
    
                int cate = 0;
    
                try {
                    cate = input.nextInt();
                } catch (Exception e) {
                    System.out.println("숫자를 입력해주세요!");
                    // 버퍼를 비워서 cate에 들어간 값을 비워줘야함.
                    input.nextLine();
                    continue;
                }
                int select = 0;
    
                if(cate == 1){
                    System.out.println("[ "+ menus.get(cate - 1).getCategory() + " ]\n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 2){
                    System.out.println("[ " + menus.get(cate - 1).getCategory() + "] \n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 3){
                    System.out.println("[ " + menus.get(cate - 1).getCategory() + " ]\n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 0){
                    System.out.println("프로그램을 종료합니다.");
                    // 강제 종료하는 느낌이 강함. break 추천.
                    check = false;
                    break;
                }else{
                    System.out.println("잘못된 번호를 입력하셨습니다!");
                    break;
                }
    
            }
        }
        public void selectMenuItem(int select, int cate){
            try {
                select = input.nextInt();
            } catch (Exception e) {
                System.out.println("숫자를 입력해주세요!");
                // 버퍼를 비워서 select에 들어간 값을 비워줘야함.
                input.nextLine();
            }
            if(select == 0){
                System.out.println("카테고리 메뉴로 돌아갑니다.");
    
            }else{
                System.out.print("선택한 메뉴 : ");
                menus.get(cate - 1).pickedItem(select - 1);
            }
        }
    
    }
    

     

    Main.java

    package lv4;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
    
            List<Menu> menus = new ArrayList<>();
            List<MenuItem> coffee = new ArrayList<>();
    
            coffee.add(new MenuItem("Espresso", 2500, "고온ㆍ고압하에서 곱게 간 커피 가루에 물을 가해, 30초 이내에 내린 커피."));
            coffee.add(new MenuItem("Americano", 3000, "에스프레소에 물을 넣어 연하게 마시는 커피."));
            coffee.add(new MenuItem("Caffé Latte", 3500, "에스프레소에 따뜻한 우유를 1:2 또는 1:3 정도의 비율로 섞은 커피."));
            coffee.add(new MenuItem("Caramel Macchiato", 4000, "에스프레소에 캐러멜 소스와 우유를 넣고 우유 거품만 살짝 올린 커피."));
            coffee.add(new MenuItem("Café Mocha", 4500, "에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피."));
    
            List<MenuItem> tea = new ArrayList<>();
            tea.add(new MenuItem("Iced Peach Black Tea", 5000, "복숭아의 진한 맛과 홍차의 조화가 매력적인 음료."));
            tea.add(new MenuItem("Grapefruit Honey Black Tea", 5300, "새콤한 자몽과 달콤한 꿀, 블랙티의 만남."));
            tea.add(new MenuItem("Yuja Mint Tea", 6100, "국내산 고흥 유자와 생강, 우릴수록 상쾌한 민트티가 조화로운 유자 민트 티."));
            tea.add(new MenuItem("Chamomile Blend Brewed Tea", 4500, "캐모마일과 레몬 그라스, 레몬밤, 히비스커스 등 블렌딩되어 은은하고 차분한 향이 기분을 좋게 하는 허브 티."));
            tea.add(new MenuItem("Earl Grey Brewed Tea", 4500, "꽃향 가득한 라벤더와 베르가못 향이 진한 홍차와 블렌딩된 향긋한 블랙티."));
    
            List<MenuItem> smoothie = new ArrayList<>();
            smoothie.add(new MenuItem("Strawberry Yogurt Smoothie", 4700, "딸기와 상큼한 요거트가 조화롭게 어우러진 스무디."));
            smoothie.add(new MenuItem("Honey Peach Smoothie", 3900, "복숭아의 리얼한 풍미와 꿀의 달콤함이 최적의 조화를 이룬 달콤하고 시원한 스무디."));
            smoothie.add(new MenuItem("Vanilla Milk Shake", 6100, "부드럽고 밀키한 우유의 맛을 진하게 즐길 수 있는 밀크 쉐이크."));
            smoothie.add(new MenuItem("Cookie Shake", 6500, "부드러운 쉐이크에 달콤한 쿠키를 가득 올린 밀크 쉐이크."));
            smoothie.add(new MenuItem("Milk Tea Shake", 5500, "홍차의 향긋한 풍미를 깊고 부드럽게 즐기는 밀크티 쉐이크."));
    
            menus.add(new Menu("COFFEE", coffee));
            menus.add(new Menu("TEA", tea));
            menus.add(new Menu("SMOOTHIE", smoothie));
    
            Kiosk kiosk = new Kiosk(menus);
            // 키오스크 시작
            kiosk.start();
        }
    }

     

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

    1. 문제 상황

    • 내가 생각했던 방식대로 데이터가 넘어가지 않았다.

     

    2. 해결 과정

    • Ctrl + 마우스 좌클릭을 이용하여 어디서 사용된 것들인지 일일히 확인하였다.
    • 그래도 이해가 되지 않아서 어떤 식으로 데이터가 넘어가고 있는지에 대해 튜터링을 받았다.

     

    3. 문제 발생 이유

    • 클래스와 생성자에 대한 이해가 부족하다.

     

     

    Lv5. 캡슐화 적용하기

    1. 개발 조건 및 코드

    • MenuItem, Menu 그리고 Kiosk 클래스의 필드에 직접 접근하지 못하도록 설정.
    • Getter와 Setter 메서드를 사용해 데이터를 관리.

     

    [Lv5. 완성 코드] 

    더보기

    MenuItem.java

    package lv5;
    
    public class MenuItem {
    
        // 불변객체 설정
        private final String item;
        private final int price;
        private final String info;
    
        // 생성자
        public MenuItem(String item, int price, String info){
            this.item = item;
            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 item + "   | W " + price + " | " + info;
        }
    
        //불필요한 getter, setter 삭제
        public String getItem() {
            return item;
        }
    
        public int getPrice() {
            return price;
        }
    
        public String getInfo() {
            return info;
        }
    }
    

     

    Menu.java

    package lv5;
    
    import java.util.List;
    
    public class Menu {
    
        // 속성
        private final String category;
        private final List<MenuItem> menuItems;
    
        // 생성자
        public Menu(String category, List<MenuItem> menuItems) {
            this.category = category;
            this.menuItems = menuItems;
        }
    
        // 기능
        public String getCategory() {
            return category;
        }
    
        //메뉴를 순차적으로 보여주는 함수
        public void showMenuItems(){
            for (int i=0; i<menuItems.size(); i++) {
                System.out.println( i + 1 + ". " + menuItems.get(i));
            }
        }
    
        public void pickedItem(int select) {
                MenuItem menuItem = menuItems.get(select);
                System.out.println(menuItem.getItem() + " | " + menuItem.getPrice() + "원 | " + menuItem.getInfo() + "\n");
        }
    
        }

     

     Kiosk.java

    package lv5;
    
    import java.util.List;
    import java.util.Scanner;
    
    public class Kiosk {
    
        // 속성
        private final List<Menu> menus;
    
        // 생성자
        public Kiosk(List<Menu> menus){
            this.menus = menus;
        }
    
        Scanner input = new Scanner(System.in);
        // 기능
        public void start() {
    
    
            // while문 break 용도
            boolean check = true;
    
            while (check) {
                // 카테고리 목룍
                System.out.println("[ SKY CAFE ]");
                for (int i = 0; i < menus.size(); i++) {
                    System.out.println(i + 1 + ". " + menus.get(i).getCategory());
                }
                System.out.print("카테고리를 선택해주세요(종료 시 0 입력): ");
    
                int cate = 0;
    
                try {
                    cate = input.nextInt();
                } catch (Exception e) {
                    System.out.println("숫자를 입력해주세요!");
                    // 버퍼를 비워서 cate에 들어간 값을 비워줘야함.
                    input.nextLine();
                    continue;
                }
                int select = 0;
    
                if(cate == 1){
                    System.out.println("[ "+ menus.get(cate - 1).getCategory() + " ]\n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 2){
                    System.out.println("[ " + menus.get(cate - 1).getCategory() + " ]\n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 3){
                    System.out.println("[ " + menus.get(cate - 1).getCategory() + " ]\n");
                    menus.get(cate - 1).showMenuItems();
                    System.out.println();
                    System.out.print("메뉴를 선택해주세요 (0 입력 시 뒤로가기): ");
                    selectMenuItem(select, cate);
    
                }else if(cate == 0){
                    System.out.println("프로그램을 종료합니다.");
                    // 강제 종료하는 느낌이 강함. break 추천.
                    check = false;
                    break;
                }else{
                    System.out.println("잘못된 번호를 입력하셨습니다!");
                    break;
                }
    
            }
        }
        public void selectMenuItem(int select, int cate){
            try {
                select = input.nextInt();
            } catch (Exception e) {
                System.out.println("숫자를 입력해주세요!");
                // 버퍼를 비워서 select에 들어간 값을 비워줘야함.
                input.nextLine();
            }
            if(select == 0){
                System.out.println("카테고리 메뉴로 돌아갑니다.");
    
            }else{
                System.out.print("선택한 메뉴 : ");
                menus.get(cate - 1).pickedItem(select - 1);
            }
        }
    
    }

     

    Main.java

    package lv5;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
    
            List<Menu> menus = new ArrayList<>();
            List<MenuItem> coffee = new ArrayList<>();
    
            coffee.add(new MenuItem("Espresso", 2500, "고온ㆍ고압하에서 곱게 간 커피 가루에 물을 가해, 30초 이내에 내린 커피."));
            coffee.add(new MenuItem("Americano", 3000, "에스프레소에 물을 넣어 연하게 마시는 커피."));
            coffee.add(new MenuItem("Caffé Latte", 3500, "에스프레소에 따뜻한 우유를 1:2 또는 1:3 정도의 비율로 섞은 커피."));
            coffee.add(new MenuItem("Caramel Macchiato", 4000, "에스프레소에 캐러멜 소스와 우유를 넣고 우유 거품만 살짝 올린 커피."));
            coffee.add(new MenuItem("Café Mocha", 4500, "에스프레소에 우유와 초콜릿을 넣고 휘핑크림을 올린 커피."));
    
            List<MenuItem> tea = new ArrayList<>();
            tea.add(new MenuItem("Iced Peach Black Tea", 5000, "복숭아의 진한 맛과 홍차의 조화가 매력적인 음료."));
            tea.add(new MenuItem("Grapefruit Honey Black Tea", 5300, "새콤한 자몽과 달콤한 꿀, 블랙티의 만남."));
            tea.add(new MenuItem("Yuja Mint Tea", 6100, "국내산 고흥 유자와 생강, 우릴수록 상쾌한 민트티가 조화로운 유자 민트 티."));
            tea.add(new MenuItem("Chamomile Blend Brewed Tea", 4500, "캐모마일과 레몬 그라스, 레몬밤, 히비스커스 등 블렌딩되어 은은하고 차분한 향이 기분을 좋게 하는 허브 티."));
            tea.add(new MenuItem("Earl Grey Brewed Tea", 4500, "꽃향 가득한 라벤더와 베르가못 향이 진한 홍차와 블렌딩된 향긋한 블랙티."));
    
            List<MenuItem> smoothie = new ArrayList<>();
            smoothie.add(new MenuItem("Strawberry Yogurt Smoothie", 4700, "딸기와 상큼한 요거트가 조화롭게 어우러진 스무디."));
            smoothie.add(new MenuItem("Honey Peach Smoothie", 3900, "복숭아의 리얼한 풍미와 꿀의 달콤함이 최적의 조화를 이룬 달콤하고 시원한 스무디."));
            smoothie.add(new MenuItem("Vanilla Milk Shake", 6100, "부드럽고 밀키한 우유의 맛을 진하게 즐길 수 있는 밀크 쉐이크."));
            smoothie.add(new MenuItem("Cookie Shake", 6500, "부드러운 쉐이크에 달콤한 쿠키를 가득 올린 밀크 쉐이크."));
            smoothie.add(new MenuItem("Milk Tea Shake", 5500, "홍차의 향긋한 풍미를 깊고 부드럽게 즐기는 밀크티 쉐이크."));
    
            menus.add(new Menu("COFFEE", coffee));
            menus.add(new Menu("TEA", tea));
            menus.add(new Menu("SMOOTHIE", smoothie));
    
            Kiosk kiosk = new Kiosk(menus);
            // 키오스크 시작
            kiosk.start();
        }
    }
    

     

     

    🤓 회고

    생성자와 클래스 부분에 대한 이해가 부족해 Lv4 에서 꽤나 고전했던 터라 필수과제까지 겨우 완료했다.

    비록 저번의 회고에서 다짐했던대로 도전과제를 시도해보지는 못했지만, 내가 어떤 부분이 부족한 지 깨달을 수 있었기 때문에 나름의 수확이 있었다고 생각한다. 생성자와 클래스에 대해 좀 더 공부해보고, 저번 피드백 받은 과제에 대해 다시 한 번 고민해보고 개선해보는 시간을 가져야겠다.

    반응형