본 캠프_15일차

졸용·2025년 3월 10일

TIL

목록 보기
16/144

⭐ 두 번째 개인 프로젝트 - 키오스크

⭐ 현재 초기 작성 및 수정 중인 코드

package secondproject;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MenuItem {

    private 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;
    }

    // 각 속성에 대한 getter 메서드
    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }
    public String getDescription() {
        return description;
    }

    // 메뉴마다 항목 추가 메서드
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 메뉴 항목을 담을 리스트 생성
        List<MenuItem> menuItems = new ArrayList<>();

        // 메뉴 항목을 리스트에 추가
        menuItems.add(new MenuItem("Bulgogi Burger", 4.7, "마요네즈, 양파, 레터스, 불고기소스, 불고기패티가 토핑된 불고기버거"));
        menuItems.add(new MenuItem("Shrimp Burger", 4.7, "타르타르 소스, 새우 패티, 양상추, 사우전드 아일랜드 드레싱이 토핑된 새우버거"));
        menuItems.add(new MenuItem("Cheese Burger", 5.2, " 머스타드 소스, 마요네즈, 저민 양파, 저민 피클, 치즈, 쇠고기 패티가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Chicken Burger", 4.0, "닭다리살패티, 데리야키소스, 양상추, 마요네즈, 머스타드가 토핑된 치킨버거"));
        menuItems.add(new MenuItem("Hanwoo Bulgogi Burger", 8.6, "마요네즈, 양파, 레터스, 불고기소스, 한우패티로 구성된 한우불고기버거"));


        // 메뉴 출력
        System.out.println("[ Lotteria Menu ]");
        for (int i = 0; i < menuItems.size(); i++) {
            System.out.println((i + 1) + ". " + menuItems.get(i).getName() + " | " + menuItems.get(i).getPrice() + " | " + menuItems.get(i).getDescription());
        }
    }

    // 사용자로부터 메뉴 입력받는 메서드
    public int getUserChoice(Scanner sc, int menuSize) {
        int choice;
        while(true) {
            System.out.println("원하는 제품의 번호를 입력해주세요");
        }
    }




}


// 세부 메뉴 속성 가지는 클래스
// 예) 햄버거 이름, 설명, 가격
// List를 선언하여 여러 메뉴 추가 -> List<MenuItem> menuItems = new ArrayList<>();

// new MenuItem("Bulgogi Burger", 4.7, "마요네즈, 양파, 레터스, 불고기소스, 불고기패티가 토핑된 불고기버거")
// new MenuItem("Shrimp Burger", 4.7, "타르타르 소스, 새우 패티, 양상추, 사우전드 아일랜드 드레싱이 토핑된 새우버거")
// new MenuItem("Cheese Burger", 5.2, " 머스타드 소스, 마요네즈, 저민 양파, 저민 피클, 치즈, 쇠고기 패티가 토핑된 치즈버거")
// new MenuItem("Chicken Burger", 4.0, "닭다리살패티, 데리야키소스, 양상추, 마요네즈, 머스타드가 토핑된 치킨버거")
// new MenuItem("Hanwoo Bulgogi Burger", 8.6, "마요네즈, 양파, 레터스, 불고기소스, 한우패티로 구성된 한우불고기버거")

// 나중에 음료 메뉴 추가

⭐ 생성자

//메뉴 아이템을 생성할 때 생성하는 생성자
    public MenuItem(String name, double price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }
  • 객체가 생성될 때 자동으로 호출되며, 메뉴 항목의 이름, 가격, 설명을 파라미터로 받아 해당 값들을 클래스의 인스턴스 변수에 할당한다.

✅ 짚고 넘어가는 생성자 특징

  • 메서드 이름이 클래스 이름과 동일하다

  • 반환 타입이 없다 (심지어 void도 아님)

  • 객체가 생성될 때 자동으로 호출된다

  • 생성자는 클래스 내에서 여러 개를 정의할 수 있다 (오버로딩 가능)

➡️ MenuItem 객체가 생성될 때마다 각 객체마다 다른 이름, 가격, 설명을 가질 수 있게 된다

public MenuItem() {
		// 예시) 기본 생성자는 값을 초기화 할 수 있다
}

⭐ Getter 메서드

// 각 속성에 대한 getter 메서드
    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }
    public String getDescription() {
        return description;
    }
  • getter 메서드는 클래스 외부에서 객체의 필드 값을 접근할 수 있도록 해주는 역할을 한다

⭐ 메뉴 항목을 리스트에 추가

// 메뉴 항목을 담을 리스트 생성
        List<MenuItem> menuItems = new ArrayList<>();

        // 메뉴 항목을 리스트에 추가
        menuItems.add(new MenuItem("Bulgogi Burger", 4.7, "마요네즈, 양파, 레터스, 불고기소스, 불고기패티가 토핑된 불고기버거"));
        menuItems.add(new MenuItem("Shrimp Burger", 4.7, "타르타르 소스, 새우 패티, 양상추, 사우전드 아일랜드 드레싱이 토핑된 새우버거"));
        menuItems.add(new MenuItem("Cheese Burger", 5.2, " 머스타드 소스, 마요네즈, 저민 양파, 저민 피클, 치즈, 쇠고기 패티가 토핑된 치즈버거"));
        menuItems.add(new MenuItem("Chicken Burger", 4.0, "닭다리살패티, 데리야키소스, 양상추, 마요네즈, 머스타드가 토핑된 치킨버거"));
        menuItems.add(new MenuItem("Hanwoo Bulgogi Burger", 8.6, "마요네즈, 양파, 레터스, 불고기소스, 한우패티로 구성된 한우불고기버거"));

⭐ 사용자로부터 메뉴 입력 받기

// 사용자로부터 메뉴 입력받는 메서드
    public int getUserChoice(int menuSize) {
        int choice;
        while (true) {
            System.out.println("원하는 제품의 번호를 입력해주세요");
            String input = sc.nextLine();
            try {
                choice = Integer.parseInt(input);

                // 메뉴 번호가 유효한 범위에 있는지 확인
                if (choice > 0 && choice <= menuSize) {
                    return choice;
                } else {
                    System.out.println("유효하지 않은 번호입니다. 1과 " + menuSize + " 사이의 번호를 입력해주세요.");
                }
            } catch (NumberFormatException a) {
                // 숫자가 아닌 값을 입력했을 때 예외 처리
                System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
            }
        }
    }
  • String input = sc.nextLine(); choice = Integer.parseInt(input); : 사용자가 숫자를 입력해도 문자 타입으로 인식하기 때문에 필요한 과정

이번에는 더 객체지향형으로 코드를 작성하여 코드의 재사용성과 가독성을 더 높이기 위해 중간 점검을 통해 수정했다

⭐ 중간 점검 - 키오스크 수정본

⭐ MenuItem 클래스

package secondproject;

import java.util.ArrayList;
import java.util.List;

public class MenuItem {

    public String name;
    public double price;
    public String description;

    //메뉴 아이템을 생성할 때 생성하는 생성자
    public MenuItem(String name, double price, String description) {
        this.name = name;
        this.price = price;
        this.description = description;
    }

    // 버거 항목을 리스트에 추가하는 메서드
    public static List<MenuItem> BurgerMenu() {
        List<MenuItem> Burgers = new ArrayList<>();

        Burgers.add(new MenuItem("Bulgogi Burger", 4.7, "마요네즈, 양파, 레터스, 불고기소스, 불고기패티가 토핑된 불고기버거"));
        Burgers.add(new MenuItem("Shrimp Burger", 4.7, "타르타르 소스, 새우 패티, 양상추, 사우전드 아일랜드 드레싱이 토핑된 새우버거"));
        Burgers.add(new MenuItem("Cheese Burger", 5.2, " 머스타드 소스, 마요네즈, 저민 양파, 저민 피클, 치즈, 쇠고기 패티가 토핑된 치즈버거"));
        Burgers.add(new MenuItem("Chicken Burger", 4.0, "닭다리살패티, 데리야키소스, 양상추, 마요네즈, 머스타드가 토핑된 치킨버거"));
        Burgers.add(new MenuItem("Hanwoo Bulgogi Burger", 8.6, "마요네즈, 양파, 레터스, 불고기소스, 한우패티로 구성된 한우불고기버거"));

        return Burgers;
    }

    // 음료 항목을 리스트에 추가하는 메서드
    public static List<MenuItem> DrinkMenu() {
        List<MenuItem> Drinks = new ArrayList<>();

        Drinks.add(new MenuItem("Pepsi Cola", 2.0, "콜라"));
        Drinks.add(new MenuItem("Pepsi Cola Zero Sugar", 2.0, "제로 콜라"));
        Drinks.add(new MenuItem("Chilsung Cider", 1.7, "사이다"));
        Drinks.add(new MenuItem("Cafe Americano", 2.5, "아메리카노"));
        Drinks.add(new MenuItem("Lemonade", 2.7, "레몬에이드"));

        return Drinks;
    }
}


// 세부 메뉴 속성 가지는 클래스
// List를 선언하여 여러 메뉴 추가 -> List<MenuItem> menuItems = new ArrayList<>();

// 나중에 음료 등 다른 메뉴 추가

// 이름, 가격, 설명 필드 선언하여 관리

// 구조에 맞게 함수를 선언해놓고 가져다 사용

⭐ Menu 클래스

package secondproject;

import java.util.ArrayList;
import java.util.List;

public class Menu {

    public String name;

    // 메뉴 항목 저장할 리스트
    public List<MenuItem> menuItems;

    // 생성자 (메뉴 항목 받아서 카테고리 메뉴 항목 초기화)
    public Menu(String name) {
        this.name = name;

        // 메뉴 항목 리스트 불러오기
        if (name.equals("버거 메뉴")) {
            this.menuItems = MenuItem.BurgerMenu();
        } else if (name.equals("음료 메뉴")) {
            this.menuItems = MenuItem.DrinkMenu();
        }
    }

    // 메뉴 항목 출력 메서드
    public void printMenuItem() {
        System.out.println("[[ Lotteria Menu ]]");
        System.out.println();
        System.out.println("[ " + name + " ]");
        for (int i = 0; i < menuItems.size(); i++) {
            MenuItem items = menuItems.get(i);
            System.out.println((i + 1) + ". " + items.name + " | " + items.price + " | " + items.description);
        }
    }

    // 메뉴 크기 계산 메서드
    public int MenuSize() {
        return menuItems.size();
    }

    public static int TotalMenuSize(Menu burgerMenu, Menu drinkMenu) {
        return burgerMenu.MenuSize() + drinkMenu.MenuSize();
    }
}


// MenuItem 클래스를 관리하는 클래스
// 카테고리 이름 필드 추가 -> 버거 메뉴, 음료 메뉴, 디저트 메뉴 등 각 카테고리 내에 여러 MenuItem 을 포함

// MenuItem 클래스를 List로 관리

// List에 포함된 MenuItem을 순차적으로 보여주는 함수
// List를 리턴하는 함수

// 구조에 맞게 함수를 선언해놓고 가져다 사용

⭐ Kiosk 클래스

package secondproject;

import java.util.Scanner;

public class Kiosk {

    Scanner sc = new Scanner(System.in);

    // 키오스크 시작 메서드
    public void start() {
        System.out.println("키오스크를 시작합니다.");
        System.out.println();
    }

    // 메뉴 크기 메서드
    public int menuSize() {
        return Menu.TotalMenuSize(burgerMenu, drinkMenu);
    }

    // 메뉴 카테고리 초기화
    Menu burgerMenu = new Menu("버거 메뉴");
    Menu drinkMenu = new Menu("음료 메뉴");

    // 사용자한테 메뉴 보여주고 번호 입력 받는 메서드
    public int getUserChoice(int menuSize) {
        int choice;
        while (true) {
            burgerMenu.printMenuItem();
            System.out.println();
            drinkMenu.printMenuItem();

            System.out.println("원하는 제품의 번호를 입력해주세요");
            String input = sc.nextLine();
            try {
                choice = Integer.parseInt(input);

                // 메뉴 번호가 유효한 범위에 있는지 확인
                if (choice > 0 && choice <= menuSize) {
                    return choice;
                } else {
                    System.out.println("유효하지 않은 번호입니다. 1 ~ " + menuSize + " 사이의 번호만 입력해주세요.");
                }
            } catch (NumberFormatException a) {   // 숫자가 아닌 값을 입력했을 때 예외 처리
                System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
            }
        }
    }
}


// 프로그램 순서 및 흐름 제어를 담당하는 클래스
// 키오스크 실행 시 콘솔에 햄버거 메뉴 (with 선택번호) 출력, 종료 (with 선택번호) 함께 출력
// 사용자에게 숫자를 입력 받아 메뉴를 선택, 0을 입력하면 프로그램 종료
// 예외처리는 오류메시지 출력

// 스캐너 선언
// 반복문 시작

// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력

// 카테고리 숫자 입력 받기

// 입력 받은 숫자가 올바르다면 인덱스로 활용하여 List에 접근하기
// List<Menu>에 인덱스로 접근하여 Menu만 추출할 수 있도록하기

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

// 주문할 메뉴 숫자 입력 받기
// 입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기
// menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어오기

➡️ Menu burgerMenuMenu drinkMenu : 버거 메뉴와 음료 메뉴를 관리하는 Menu 객체

// 각 카테고리 초기화
    Menu burgerMenu = new Menu("버거 메뉴");
    Menu drinkMenu = new Menu("음료 메뉴");

⭐ Main 클래스

package secondproject;

public class Main {
    public static void main(String[] args) {

        Kiosk kiosk = new Kiosk();

        // 키오스크 시작 메서드 호출
        kiosk.start();

        // 크기 계산한 메뉴 사이즈 호출해서 사용자 선택받기 메서드 호출하기
        int totalMenuSize = kiosk.menuSize();
        int userChoice = kiosk.getUserChoice(totalMenuSize);
    }
}


// 시작 지점이 되는 클래스
// Main = User 라고 생각하기 (키오스크 시작하기, 카테고리 선택하기, 결제하기 등)

// Menu 객체 생성하면서 카테고리 이름 설정 (버거, 음료, 디저트 등등)
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입

// Kiosk 객체 생성
// Kiosk 내 시작하는 함수 호출 -> 키오스크 프로그램을 시작하는 메서드 구현하고 -> start 함수 만들어서 관리

➡️ 객체지향형의 코드를 작성하기 위해 각 클래스마다 역할을 분배한 메서드들 생성

➡️ Main 클래스에서 각 클래스의 메서드들을 호출하여 유저가 사용 가능한 방식으로 수정

➡️ 단계별로 차근차근 작성하기 위해 일시적으로 캡슐화 관련 코드 제거

⭐ 트러블 슈팅

⚠️ "[[ Lotteria Menu ]]" 문구는 한 번만 출력되면 되는데 두 번 출력되는 결과 발견

// 크기 계산한 메뉴 사이즈 호출해서 사용자 선택받기 메서드 호출하기
        System.out.println("[[ Lotteria Menu ]]");
        System.out.println();
        int totalMenuSize = kiosk.menuSize();
        int userChoice = kiosk.getUserChoice(totalMenuSize);

➡️ 문구 출력하는 코드를 Main 클래스로 옮겨서 메서드 호출 시에 반복되지 않도록 수정

⚠️ 범위 초과 오류 발견

// 메뉴 항목 출력 메서드
    public void printMenuItem() {
        System.out.println("[ " + name + " ]");
        for (int i = 0; i <= menuItems.size(); i++) {
            MenuItem items = menuItems.get(i);
            System.out.println((i + 1) + ". " + items.name + " | " + items.price + " | " + items.description);
        }
    }

➡️ for 문법 안에서 (int i = 0; i < menuItems.size(); i++) 범위 수정

<= 를 사용하면 인덱스의 범위를 초과하는 값을 반환하기 때문

⚠️ Kiosk 클래스의 getUserChoice 메서드

계산기 개인 과제를 했을 때처럼 getUserchoice 메서드의 사용자에게 번호를 입력받는 부분과 유효한 숫자인지 확인하는 부분을 따로 각각의 메서드로 분리하려고 했는데, 그럴 경우, 또 Main 클래스에서의 코드가 길어지고 객체지향형의 방향성을 잃게 될 것 같아 다시 합쳤다

➡️ 나중에 피드백 받을 때 더 나은 방향이 있는지 학습할 예정

profile
꾸준한 공부만이 답이다

0개의 댓글