Post

[Java] 키오스크 장바구니 및 구매하기 기능을 추가하기

adding cart function to kiosk

[Java] 키오스크 장바구니 및 구매하기 기능을 추가하기

오늘 키오스크라는 실습과제에 Cart.java 클래스를 새로 추가봤습니다. 이 클래스는 장바구니 역할을 수행하며 사용자가 선택한 메뉴 아이템들을 저장하고 총액을 계산하거나 목록을 초기화할 수 있습니다. 단순한 기능처럼 보이지만 구현하면서 꽤 많은 생각과 수정이 필요했습니다.

Cart.java는 어떤 일을 하나요?

  • 사용자가 선택한 MenuItem을 리스트에 저장합니다.
  • 항목들을 출력해 보여주고 총 가격을 계산합니다.
  • 장바구니를 초기화하거나 추후 삭제 기능도 추가할 예정입니다.

😄 가장 피곤했던 부분

새 기능을 추가할 때마다 Kiosk.java 클래스의 흐름과 로직을 자꾸 수정해야 한다는 점이 반복적으로 시간을 많이 잡아먹습니다. 장바구니 추가, 확인 버튼, 취소 로직 등 새로운 기능이 생길 때마다 Kiosk가 점점 더 복잡해지고 있어요.

Main.java

1
2
3
4
5
6
public class Main {
    public static void main(String[] args) {
        Kiosk kiosk = new Kiosk();
        kiosk.start();
    }
}

Kiosk.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public class Kiosk {
    private final Cart cart = new Cart();

    public void start() {
        Scanner input = new Scanner(System.in);
        List<Menu> menus = Menu.getMenus();

        while (true) {
            System.out.println("[ MAIN MENU ]");
            for (int i = 0; i < menus.size(); i++) {
                System.out.println((i + 1) + ". " + menus.get(i).getName());
            }
            System.out.println("0. 종료      | 종료");

            try {
                int choice = input.nextInt();
                if (choice == 0) {
                    System.out.println("프로그램을 종료합니다.");
                    System.exit(0);
                }
                if (choice > 0 && choice <= menus.size()) {
                    Menu selectedMenu = menus.get(choice - 1);
                    List<MenuItem> items = selectedMenu.getMenuItems();

                    while (true) {
                        System.out.println("[ " + selectedMenu.getName() + " MENU ]");
                        for (int i = 0; i < items.size(); i++) {
                            System.out.println((i + 1) + "." + items.get(i));
                        }
                        System.out.println("0. 돌아가기");

                        int itemChoice = input.nextInt();
                        if (itemChoice == 0) {
                            break;
                        }

                        MenuItem selectedItem = items.get(itemChoice - 1);

                        if (itemChoice > 0 && itemChoice <= items.size()) {
                            System.out.println("선택된 메뉴: " + selectedItem.getName());
                        } else {
                            System.out.println("잘못된 입력입니다");
                        }

                        System.out.println(selectedItem.getName());
                        System.out.println("1. 확인        2. 취소");

                        int itemCheck = input.nextInt();
                        if (itemCheck == 1) {
                            cart.add(selectedItem);
                            System.out.println(selectedItem + "이 장바구니에 추가되었습니다.");
                        } else {
                            if (itemCheck == 0) {
                                break;
                            }
                        }
                    }
                }
                else {
                    System.out.println("잘못된 입력입니다");
                }

            } catch (Exception e) {
                System.out.println("숫자를 입력해 주세요. (" + e.getMessage() + ")");
                input.nextLine();
            }
        }
    }
}

MenuItem.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MenuItem {

    private final String name;
    private double price;
    private String description;

    public MenuItem(String name, double price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }
    @Override
    public String toString() {
        return String.format(" %-14s | W %.1f | %s", name, price, description);
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String getDescription() {
        return description;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

Menu.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Menu {
    private final String name;
    private final List<MenuItem> menuItems;

    public Menu(String name) {
        this.name = name;
        this.menuItems = new ArrayList<>();
    }

    public void add(MenuItem menuItem) {
        menuItems.add(menuItem);
    }

    public String getName() {
        return name;
    }

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

    public static List<Menu> getMenus() {
        List<Menu> category = new ArrayList<>();

        Menu burgerMenu = new Menu("BURGERS");
        burgerMenu.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
        burgerMenu.add(new MenuItem("SmokeShack",8.9,"베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
        burgerMenu.add(new MenuItem("Cheeseburger",6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
        burgerMenu.add(new MenuItem("Hamburger", 5.4,"비프패티를 기반으로 야채가 들어간 기본버거"));

        Menu drinkMenu = new Menu("DRINKS");
        drinkMenu.add(new MenuItem("Cola", 2.0, "캔"));

        Menu dessertMenu = new Menu("DESSERT");
        dessertMenu.add(new MenuItem("CupCake", 5.5, "크림치즈, 블루베리"));

        category.add(burgerMenu);
        category.add(drinkMenu);
        category.add(dessertMenu);

        return category;
    }
}

Cart.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Cart {
    private final List<MenuItem> items =  new ArrayList<>();

    public void add(MenuItem item){
        items.add(item);
    }

    public void show() {
        for (MenuItem item : items) {
            System.out.println("- " + item.getName() + "| W" + item.getPrice());
        }
        System.out.printf("W %.1f\n", getTotal());
    }

    public double getTotal() {
        double total = 0;
        for (MenuItem item : items) {
            total += item.getPrice();
        }
        return total;
    }

    public void clear() {
        items.clear();
    }
}

실행 결과

image1 image2 image3

아직 진행 중

아직 끝난 게 아닙니다. 앞으로는 장바구니 확인, 주문 확정, 주문 내역 저장 기능까지 제대로 동작하는 게 목표입니다. 이 과정을 통해 객체 지향 설계와 캡슐화 원칙을 더 잘 이해하게 되는 중입니다. 코드만 보면 간단해 보일 수 있지만 실제로 구현하면 생각할 게 정말 많아요!

This post is licensed under CC BY 4.0 by the author.