Hyeok의 웹 개발 블로그

<2025.03.13> 키오스크 과제 Lv4 and Lv5 본문

TIL/Java

<2025.03.13> 키오스크 과제 Lv4 and Lv5

Yhyeok 2025. 3. 13. 23:01

💡  키오스크 과제 Lv4 , Lv 5 를 구현해보았습니다.

 

조건 

▷ Lv 4 

 - Menu 클래스 생성하기

 - MenumItem 클래스를 관리하는 클래스

 - List<MenuItem> 은 Kiosk 클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경

 - 여러 버거들을 포함하는 상위 개념 '버거' 같은 카테고리 이름 필드 생성

 - 메뉴 카테고리 이름을 반환하는 메서드를 구현

 

▷ Lv 5

 - MenuItem, Menu 그리고 Kiosk 클래스의 필드에 직접 접근하지 못하도록 설정

 - Getter, Setter 메서드를 사용해 데이터를 관리


🎈 Menu 클래스를 생성합니다.

 

Kiosk 클래스가 관리하던 List<MenuItem>을 Menu 클래스로 변경합니다.

public class Menu {
    List<MenuItem> menuItems;
Menu() {
    menuItems = new ArrayList<>(); // menuItem 리스트를 초기화 시킨다.  (초기화 하지않고 실행 했더니 오류가 발생)
    menuItems.add(new MenuItem("ShackBuger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
    menuItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
    menuItems.add(new MenuItem("Cheesebuger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
    menuItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));

 

그리고 여기서 상위 카테고리인 MenuCategory 를 구현해줍니다.

List<String> menuCategory;
menuCategory = new ArrayList<>(); // menuCategory 리스트를 초기화 시킨다.
menuCategory.add("Burgers");
menuCategory.add("Drinks");
menuCategory.add("Desserts");

그리고 메뉴 카테고리 이름을 메서드를 구현해  return 값으로 반환해줍니다.

List<MenuItem> getMenuItems(){
    return this.menuItems;
}
List<String> getMenuCategory(){
    return this.menuCategory;
}

 

그리고 Kiosk 클래스로 넘어가 새로만든 상위 카테고리를 실행시키기 위해 start 함수 매서드에 구현을 해줍니다.

while 문 안쪽 상단에 구현을 해주었습니다.

for 문을 사용해서 List를 활용해 작성을 해주었습니다.

System.out.println(" ");
System.out.println("[ MAIN MENU ]");
List<String> category = menu.getMenuCategory();
for (int i = 0; i < category.size(); i++) {
    System.out.println((i + 1) + ". " + category.get(i));
}

그리고 버거 메뉴도 새롭게 작성했습니다.

if (number1 == 1) {
    System.out.println(" ");
    System.out.println("[ BURGERS MENU ]");
    List<MenuItem> burgers = menu.getMenuItems();
    for (int i = 0; i < burgers.size(); i++) {
        System.out.println((i + 1) + ". " + burgers.get(i).getName() + "   | W " + burgers.get(i).getPrice() + " |   " + burgers.get(i).getDescription());
    }
    System.out.println("0. 종료    | 종료");

그리고 마지막 버거 메뉴를 선택 하기 위해 switch문을 사용했고, number2를 입력해 구현했습니다.

switch (number2) {
    case 1:
        System.out.println("선택한 메뉴 : " + burgers.get(0).getName() + "   | W " + burgers.get(0).getPrice() + " |   " + burgers.get(0).getDescription());
        // menuItem.get(0); 으로만 해서 soutv 했을땐, kiosk_lv2.lv2.MenuItem@52cc8049 와 같이 나왔음. >>  @~~~ 주소를 나타낸다.
        break;
    case 2:
        System.out.println("선택한 메뉴 : " + burgers.get(1).getName() + "   | W " + burgers.get(1).getPrice() + " |   " + burgers.get(1).getDescription());
        break;
    case 3:
        System.out.println("선택한 메뉴 : " + burgers.get(2).getName() + "   | W " + burgers.get(2).getPrice() + " |   " + burgers.get(2).getDescription());
        break;
    case 4:
        System.out.println("선택한 메뉴 : " + burgers.get(3).getName() + "   | W " + burgers.get(3).getPrice() + " |   " + burgers.get(3).getDescription());
        break;

}
if (number2 == 0) {
    System.out.println("주문을 종료합니다.");
    break;

그리고 Main 클래스에 kiosk 메서드 start를 가져와 실행했습니다.

public class Main {
    public static void main(String[] args) {
        Menu menu = new Menu();
        List<MenuItem> menuItems = new ArrayList<>();
        Kiosk kiosk = new Kiosk();
        kiosk.start();
   }
}

 


 🎈 Menu 클래스에 캡슐화를 진행해줬습니다. 

 

 public 으로 지정되어있던 내용을 private로 변경했습니다.

public class Menu {
    private List<MenuItem> menuItems;
    private List<String> menuCategory;
    private List<MenuItem> drinkMenu = new ArrayList<>();
    private List<MenuItem> dessertsMenu = new ArrayList<>();

 

그리고 게터를 사용해줬습니다.

List<MenuItem> getMenuItems(){
    return this.menuItems;
}
List<String> getMenuCategory(){
    return this.menuCategory;
}
List<MenuItem> getDessertsMenu(){
    return this.dessertsMenu;
}
List<MenuItem> getDrinkMenu(){
    return this.drinkMenu;
}

 

그리고 캡슐화를 진행하며, 상위 카테고리에 공백으로 존재하던 Drink 와 Dessert 부분에 메뉴를 생성했습니다.

drinkMenu = new ArrayList<>();
drinkMenu.add(new MenuItem("Coke", 1.5,"콜라"));
drinkMenu.add(new MenuItem("Sprite", 1.5, "스프라이트"));
drinkMenu.add(new MenuItem("Fanta",1.5,"환타"));
drinkMenu.add(new MenuItem("MountainDew",1.5,"마운틴듀"));

dessertsMenu = new ArrayList<>();
dessertsMenu.add(new MenuItem("IceCream",2.0,"소프트콘"));
dessertsMenu.add(new MenuItem("OnionRing",3.0,"달달한 어니언링(5개입)"));
dessertsMenu.add(new MenuItem("Cookie",3.0,"촉촉한 쿠키(5개입)"));
dessertsMenu.add(new MenuItem("ChickenNugget",4.0,"바삭한 치킨너겟(6개입)"));

 

MenuItem 클래스 또한 같은 작업을 진행했습니다.

private String name;
private double price;
private String description;
 String getName(){
        return this.name;   // 이전에 getName으로 구현하고 오류가남! main 클래스에서 무한 반복이 발생 >> getName , name 부분을 반복
    }
    double getPrice(){
        return this.price;
    }
    String getDescription(){
        return this.description;
    }
}

 

그리고 Kiosk 클래스에 새롭게 추가한 Drink 와 Dessert 메뉴에 대한 내용도 구현하였습니다.

List<MenuItem> drinks = menu.getDrinkMenu();
List<MenuItem> desserts = menu.getDessertsMenu();
if (number == 1) {
    System.out.println(" ");
    System.out.println("[ BURGERS MENU ]");
    for (int i = 0; i < burgers.size(); i++) {
        System.out.println((i + 1) + ". " + burgers.get(i).getName() + "   | W " + burgers.get(i).getPrice() + " |   " + burgers.get(i).getDescription());
    }
    System.out.println("0. 뒤로가기");

    int menuNumber = scanner.nextInt();
    scanner.nextLine();

    if (menuNumber >= 1 && menuNumber <= burgers.size()) {
        System.out.println("선택한 메뉴 : " + burgers.get(menuNumber - 1).getName() + "   | W " + burgers.get(menuNumber - 1).getPrice() + " |   " + burgers.get(menuNumber - 1).getDescription());
    }
 else if (number == 2) {
    System.out.println(" ");
    System.out.println("[ DRINK MENU ]");
    for (int i = 0; i < drinks.size(); i++) {
        System.out.println((i + 1) + ". " + drinks.get(i).getName() + "   | W " + drinks.get(i).getPrice() + " |   " + drinks.get(i).getDescription());
    }
    System.out.println("0. 뒤로가기");

    int menuNumber = scanner.nextInt();
    scanner.nextLine();

    if (menuNumber >= 1 && menuNumber <= drinks.size()) {
        System.out.println("선택한 메뉴 : " + drinks.get(menuNumber - 1).getName() + "   | W " + drinks.get(menuNumber - 1).getPrice() + " |   " + drinks.get(menuNumber - 1).getDescription());
    }
 else if (number == 3) {
    System.out.println(" ");
    System.out.println("[ DESSERT MENU ]");
    for (int i = 0; i < desserts.size(); i++) {
        System.out.println((i + 1) + ". " + desserts.get(i).getName() + "   | W " + desserts.get(i).getPrice() + " |   " + desserts.get(i).getDescription());
    }
    System.out.println("0. 뒤로가기");

    int menuNumber = scanner.nextInt();
    scanner.nextLine();

    if (menuNumber >= 1 && menuNumber <= desserts.size()) {
        System.out.println("선택한 메뉴 : " + desserts.get(menuNumber - 1).getName() + "   | W " + desserts.get(menuNumber - 1).getPrice() + " |   " + desserts.get(menuNumber - 1).getDescription());
    }

 

switch문을 사용해 메뉴를 선택하고있었지만, else - if 문으로 변경하여 구현했습니다.

그리고 Main 클래스에서 kiosk.start 로 실행해주었습니다.

public class Main {
    public static void main(String[] args) {
        Menu menu = new Menu();
        List<MenuItem> menuItems = new ArrayList<>();
        Kiosk kiosk = new Kiosk();
        kiosk.start();
   }
}

📌 트러블 슈팅

 

 - Lv 4를 구현 하던 중, Menu 클래스에 menuItem = new ArrayList<>(); 를 작성하지않고 실행을 시켰었습니다.
   그러니, 값이 표현되지않는 오류가 발생했습니다. 
   그래서 여러가지 방법을 시도해보고 찾아본 결과, menuItem = new ArrayList<>(); 문장을 작성하지 않아 발생한다는 것을 알게 되었습니다. menuItem 리스트를 초기화 시키고 실행시켜야 오류가 발생 하지 않는 사실을 알게되어

초기화를 시키고 다시 구현해 보았더니, 정상적으로 실행되는 것을 확인할 수 있었습니다.

 

- 그리고 Lv3 에서 Lv4 로 넘어오면서 작업을 할 때, 새로운 카테고리를 생성하고 Kiosk 클래스가 가지고있던 MenuItem 클래스의 내용을 Menu클래스로 넘겨오는 과정에서 어려움을 느꼈습니다. 

코드가 정리가 되지 않고 복잡했지만, 코드를 처음부터 천천히 작성해서 해결할 수 있었습니다.

 

- Kiosk 클래스를 구현할 때, 조건 중 

1. Menu가 가진 List<MenuItem>을 반복문을 활용하여 햄버거 메뉴 출력

2. [입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기

    // menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어와야 합니다.]

라는 조건에 맞춰 작성을 하였는데, 어떠한 형식으로 작성을 해야 하는지에 대한 어려움이 있었습니다. 

그래서 이전 강의 내용 자료를 찾아보며 복습을 진행했고, 질의응답을 통해 해결할 수 있었습니다.

for (int i = 0; i < category.size(); i++) {
    System.out.println((i + 1) + ". " + category.get(i));
}
if (number1 == 1) {
    System.out.println(" ");
    System.out.println("[ BURGERS MENU ]");
    List<MenuItem> burgers = menu.getMenuItems();
    for (int i = 0; i < burgers.size(); i++) {
        System.out.println((i + 1) + ". " + burgers.get(i).getName() + "   | W " + burgers.get(i).getPrice() + " |   " + burgers.get(i).getDescription());
    }
    System.out.println("0. 종료    | 종료");
System.out.println("선택한 메뉴 : " + burgers.get(0).getName() + "   | W " + burgers.get(0).getPrice() + " |   " + burgers.get(0).getDescription());

  

 

- Lv 5 구현 중 dirnks 와 desserts 를 새롭게 구현할 때, switch문을 여러개 사용해서 작성하는 것은 불필요한 작업이라 생각을 했습니다. 지금은 내용이 적어 작성은 할 수있지만, 만약 메뉴 카테고리가 더 많아진다면 switch 문을 활용하는 것이 효율적이지 않다라고 생각하여 if 문을 활용했습니다.

 

 처음에는 하단에 새롭게 if 문 작성해서 했습니다.

그렇게 진행했더니 scanner 값인 menuNumber 이 정상 작동하지 않는 오류 ( drink 카테고리에 들어가서 coke 를 선택해도 burger에 대한 값이 출력되는 오류가 발생) 와 else if 문으로 작동했을 때는 2번을 선택하면 2번을 포함한 3 , 4 번의 메뉴도 출력되는 오류가 발생했습니다.

 

> 그래서 menuNumber 1 , menuNumber 2 를 지정해서 하면 해결되지않을까? 라는 생각을 가지고 진행을 해봤지만 해결이 되지않았습니다. 그리고 여러개의 menuNumber를 지정할 필요가 없다라고 판단을 했습니다.

> 다음으로는 if 문이 아닌 else-if를 사용해야하는 건 아닐까? 라고 생각해 작성해보았지만 해결되지 않았습니다.

여러가지 방법을 시도해보고 무엇이 문제인지 생각했을 때, 코드의 순서에 문제가 있는건 아닐까라는 생각을 했고

if (number == 1) {
    System.out.println(" ");
    System.out.println("[ BURGERS MENU ]");
    for (int i = 0; i < burgers.size(); i++) {
        System.out.println((i + 1) + ". " + burgers.get(i).getName() + "   | W " + burgers.get(i).getPrice() + " |   " + burgers.get(i).getDescription());
    }
    System.out.println("0. 뒤로가기");

    int menuNumber = scanner.nextInt();
    scanner.nextLine();

    if (menuNumber >= 1 && menuNumber <= burgers.size()) {
        System.out.println("선택한 메뉴 : " + burgers.get(menuNumber - 1).getName() + "   | W " + burgers.get(menuNumber - 1).getPrice() + " |   " + burgers.get(menuNumber - 1).getDescription());
    }


} else if (number == 2) {
    System.out.println(" ");
    System.out.println("[ DRINK MENU ]");
    for (int i = 0; i < drinks.size(); i++) {
        System.out.println((i + 1) + ". " + drinks.get(i).getName() + "   | W " + drinks.get(i).getPrice() + " |   " + drinks.get(i).getDescription());
    }
    System.out.println("0. 뒤로가기");

    int menuNumber = scanner.nextInt();
    scanner.nextLine();

    if (menuNumber >= 1 && menuNumber <= drinks.size()) {
        System.out.println("선택한 메뉴 : " + drinks.get(menuNumber - 1).getName() + "   | W " + drinks.get(menuNumber - 1).getPrice() + " |   " + drinks.get(menuNumber - 1).getDescription());
    }

 

이와같은 순서의 코드를 작성하여 오류를 해결할 수 있었습니다.

'TIL > Java' 카테고리의 다른 글

<2025.03.12> ENUM, 동등성과 동일성  (0) 2025.03.12
<2025.03.11> 키오스크 과제 Lv 3  (0) 2025.03.11
<2025.03.10> 키오스크 과제 Lv2  (0) 2025.03.10
<2025.03.07> 키오스트 과제 Lv1  (0) 2025.03.07
<2025.03.06>Java 챕터 [3-1] ~[3~3]  (0) 2025.03.06