Kiosk 과제 - Class 구별의 중요성

김현정·2025년 3월 11일
0

지난 주말에 만든 Kiosk과제를 다시 만들었습니다.

이 전에 만든 Menu클래스에서 Map을 활용하여
메뉴<햄버거<치즈버거(치즈버거, 8.9,치즈가 많이 들어간 버거), 햄버거(햄버거, 4.9, 기본햄버거)>, 드링크<콜라, 사이다>...> 리스트 안에 리스트를 만들어서 코드를 구현하였습니다.
하지만 과제에서 원한 부분은 카테고리처럼 버거라는 것 안에 버거 리스트들이 존재하는 것으로 제가 한 방식은 코드 구현이 가능은 하지만 가독성이 좋지도 않고, 동적으로 바꾸기 어려웠습니다.

동적으로 코드를 구현하지 못하는 이유는 예를 들어서 버거, 드링크의 리스트만 있는 것으로 코드를 구현했다가 디져트라는 리스트가 추가가 되면 하드코딩으로 손수 하나씩 코드를 다 고쳐야하기 때문입니다.

카테고리처럼 버거, 드링크, 디져트 등 리스트하고 버거를 꺼내오면 버거리스트들이 나오는 것을 구현하면 다른 종류가 추가되어도 동적으로 변동이 가능했습니다.

이 문제로 Menu클래스를 처음부터 다시 구현하다보니 지금까지 구현한 모든 기능들을 다 바꿔야하기에 그냥 처음부터 구현하기로 하였습니다.

  1. Menu클래스에는 카테고리 이름이 들어갈 name 변수와 MenuItem로 리스트를 만든 menuItems를 속성으로 잡습니다.
import java.util.List;

public class Menu {

    // 속성
    private String name;
    private List<MenuItem> menuItems;


    // 생성자
    public Menu(String name, List<MenuItem> menuItems) {
        this.name = name;
        this.menuItems = menuItems;

    }

    public String getName() {
        return name;
    }

    public List<MenuItem> getMenuItems() {
        return menuItems;
    }

    @Override
    public String toString() {
        return name;  // 메뉴 이름만 반환하도록 변경
    }

}
  1. 그 다음 메인이나 키오스크 클래스에 Menu객체와 Menu내부의 List<MenuItem> 를 포함하여 menus라는 새로운 리스트가 생성됩니다.
menus
 ├── Menu("Burger")  → [ShackBurger, SmokeShack, CheeseBurger, Hamburger]
 ├── Menu("Drink")   → [Coke, Lemonade, Coffee, Milkshake]  (가정)
 ├── Menu("Dessert") → [Ice Cream, Brownie, Cookie]         (가정)
        List<MenuItem> burger = new ArrayList<>();
       burger.add(new MenuItem("ShackBurger ", 6.9, "토마토, 양상추, 쉑소스가 토핑 된 치즈버거    "));
       burger.add(new MenuItem("SmokeShack  ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 "));
       burger.add(new MenuItem("CheeseBurger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거"));
       burger.add(new MenuItem("Hamburger   ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거    "));
       menus.add(new Menu("Burger", burger));

       List<MenuItem> drink = new ArrayList<>();
       drink.add(new MenuItem("Sprite      ", 0.3, "청량감이 넘치는 시원한 사이다            "));
       drink.add(new MenuItem("Cola        ", 0.3, "청량감이 넘치는 시원한 코카콜라           "));
       drink.add(new MenuItem("Orange Juice", 0.5, "오렌지 과즙이 넘치는 시원한 오렌지 주스    "));
       drink.add(new MenuItem("Tomato Juice", 0.5, "토마토 과즙이 넘치는 달달한 토마토 주스    "));
       menus.add(new Menu("Drink", drink));

       List<MenuItem> dessert = new ArrayList<>();
       dessert.add(new MenuItem("Ice-cream   ", 0.1, "우유 아이스크림                      "));
       dessert.add(new MenuItem("Pie         ", 0.3, "고구마 파이                         "));
       dessert.add(new MenuItem("FrenchFries ", 0.5, "갓 튀긴 감자튀김                     "));
       menus.add(new Menu("Dessert", dessert));
  1. 전 Kiosk 클래스에는 모든 메뉴 리스트로 하나하나 따로 구현했어야하는데, 현 Kiosk 클래스는 메뉴가 늘어나도 코드를 안바꿔도 되게 동적으로 구현하였습니다. 전 Kiosk


    햄버거 메뉴, 드링크 메뉴, 디져트 메뉴 다 따로 구현해야함.
    메뉴들이 늘어나면 코드가 계속 늘어나서 가독성이 안좋아심.

현 Kiosk

menus 리스트에서 인덱스 값을 하나씩 가져오면 되기에 메뉴를 다 따로 구현을 하지 않아도 가능함.
메뉴들이 늘어나도 자동으로 만들어짐.

  1. 또한, InputManager와 OutputManager 클래스들도 역할이 늘어나면서 kiosk클래스에 메소드들을 호출만하면 되게끔 리팩토링하였습니다.

클래스들의 역할을 확실하게 분담하여 구현을 하는 것이 중요하다는 것을 잘 알게되었습니다.
그렇다보니 다음에는 더욱 클래스의 역할을 잘 나눠보고 어떻게 만들건지 구상을 잘 해봐야할 것 같습니다.

0개의 댓글