230531(수)-TIL

조우진·2023년 6월 1일
0

TIL

목록 보기
10/28

오늘 수행한 내용

  • 개인과제 : 키오스크 만들기(진행중)

마주친 문제

객체지향관점으로 코드를 작성하지 않음

전일 키오스크 필요기능을 모두 완료했지만, 과제의 필수요구사항과 다른 방식으로 구현했고, 자바의 특징인 객체지향관점으로 코드를 작성하지 않았다.(객체 개념을 전혀 고려하지 않고 클래스를 단순 함수처럼 분리된 역할로만 사용했다.) 이에 모두 지우고 새롭게 작성을 시작했다.

현재까지 완료된 기능

1) 메인 메뉴판 출력
4) order 입력 시 현재 장바구니 목록 출력
4-1) 추가된 메뉴들과 총 가격 합을 출력
5) 주문완료 및 대기번호 발급

아직 구현하지 못한 기능

2) 메뉴카테고리 선택 시, 해당 카테고리의 상품 메뉴판 출력
3) 상품 선택 시 장바구니 추가 확인 문구
3-1) 확인 시 장바구니 메뉴 추가
3-2) 취소 시 2번 화면으로 복귀

고려할 내용(Try)

  • 객체지향 관점으로 코드 작성하기
  • 아래 관례를 따르며 접근지정자 지정하기
  • 멤버 변수 : 일반적으로 private 접근 지정자로 선언
    • 멤버 변수가 외부에서 직접 접근되지 않고, 메서드를 통해 간접적으로 접근되도록 유도
    • 변수에 접근하려면 getter/setter 메서드 사용
  • 메서드 : 필요한경우에 따라 public, protected, default, 또는 private 접근 지정자 중 하나로 선언
    • 일반적으로 외부에서 접근 가능해야 하는 기능은 public 메서드로 공개
    • 내부에서만 사용되는 기능은 private 메서드로 선언
    • protected 접근 지정자는 상속관계에서 사용
  • 클래스 : 클래스의 사용 범위에 따라 지정하기

Main.java

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Device device = new Device();
        device.LoadMenu();
        while(true) {
            device.Display();
        }
    }
}

Order.java

  • Addorder(Product product) : 장바구니에 담기
  • CompleteOrder() : 주문하기(장바구니 초기화, 대기번호 리턴)
  • CancelOrder() : 취소하기(장바구니 초기화)
  • getShoppingBag() : 장바구니 내용물 출력 및 총가격 return
public class Order {
    private ArrayList<Product> shoppingBag = new ArrayList<Product>();
    private int counter = 0;

    public void AddOrder(Product product) {
        Scanner sc = new Scanner(System.in);
        product.Show();
        System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.println("1.확인          2.취소");
        if (sc.nextInt() == 1) {
            System.out.println(product.getName() + "가 장바구니에 추가되었습니다.");
            shoppingBag.add(product);
        }
    }
    public double getShoppingBag(){//쇼핑백 내용 보여주기, 가격 return
        double totalprice = 0;
        for (Product item : shoppingBag) {
            item.Show();
            totalprice += item.getPrice(); //가격계산
        }
        return totalprice;
    }
    public int CompleteOrder() {
        shoppingBag.clear();//
        counter++;          //대기번호 +1
        return counter;
    }

    public void CancelOrder() {
        shoppingBag.clear();
    }
}

Menu.java

  • 변수 private 접근지정자 지정
  • 외부에서 값을 접근할 수 있는 getter/setter 사용
  • Show() : 메뉴판 지정형식으로 출력하는 메서드 사용
public class Menu {
    //필수 요구사항
    //메뉴 클래스는 이름, 설명 필드를 가지는 클래스로 만들어주세요.
    //1) 고유 데이터 영역
     private String name;
     private String description;

     public Menu(String name, String description){
         this.name = name;
         this.description = description;
     }
     public void Show(){
         System.out.printf("%-15s | %s\n", name, description);
     }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}

Product.java

  • Show() 메서드 오버라이딩 : 메뉴판 지정형식+가격필드 추가 출력하는 메서드
public class Product extends Menu {
    //필수요구사항
    //상품 클래스는 이름, 가격, 설명 필드를 가지는 클래스로 만들어주세요.
    //상품 클래스의 이름, 설명 필드는 메뉴 클래스를 상속받아 사용하는 구조로 개발해주세요.
    private double price;
    public Product(String name, String description, double price) {
        super(name, description);
        this.price = price;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public void Show()
    {
        System.out.printf("%-15s | W %s |%s\n", getName(), price,getDescription());
    }

}

Device.java

  • LoadMenu() : 카테고리, 상품 선언 및 ArrayList에 담기
  • ShowCategoryMenu() : 카테고리메뉴판 출력
  • ShowOption() : 카테고리 메뉴 선택 때만 보여줄 옵션메뉴(5.order/6.cancel)
public class Device {
    Order order = new Order();
    ArrayList<Menu> categoryMenu = new ArrayList<Menu>(); // 카테고리 메뉴판
    ArrayList<Product> burgers = new ArrayList<Product>();
    ArrayList<Product> frozenCustard = new ArrayList<Product>();
    ArrayList<Product> drinks = new ArrayList<Product>();
    ArrayList<Product> beer = new ArrayList<Product>();


    public void LoadMenu(){//
        Menu burgersMenu = new Menu("Burgers","앵거스 비프 통살을 다져만든 버거");
        Menu frozencustardMenu = new Menu("Frozen Custard","매장에서 신선하게 만드는 아이스크림");
        Menu drinksMenu = new Menu("Drinks","매장에서 직접 만드는 음료");
        Menu beerMenu = new Menu("Beer","뉴욕 브루클린 브루어리에서 양조한 맥주");
        categoryMenu.add(burgersMenu);
        categoryMenu.add(frozencustardMenu);
        categoryMenu.add(drinksMenu);
        categoryMenu.add(beerMenu);

        Product shackBurger = new Product("ShackBurger","토마토, 양상추, 쉑소스가 토핑된 치즈버거",6.9);
        Product smokeShack = new Product("SmokeShack","베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거",8.9);
        Product shroomBurger = new Product("Shroom Burger","몬스터 치즈와 체다 치즈로 속을 채운 베지테리안 버거",9.4);
        Product cheeseBurger = new Product("Cheeseburger","포테이토 번과 비프패티, 치즈가 토핑된 치즈버거",5.4);
        Product hamBurger = new Product("Hamburger","비프패티를 기반으로 야채가 들어간 기본버거",6.9);
        burgers.add(shackBurger);
        burgers.add(smokeShack);
        burgers.add(shroomBurger);
        burgers.add(cheeseBurger);
        burgers.add(hamBurger);

        Product shakes = new Product("Shakes", "바닐라, 초콜렛, 솔티드 카라멜, 블랙 & 화이트, 스트로베리, 피넛 버터, 커피",5.9);
        Product shakeOfTheWeek = new Product("Shake of the Week", "특별한 커스터드 플레이버",6.5);
        Product redBeanShake = new Product("Red Bean Shake","신선한 커스터드와 함께 우유와 레드빈이 블렌딩 된 시즈널 쉐이크",6.5);
        Product floats = new Product("Floats", "루트 비어, 퍼플 카우, 크림 시클", 5.9);
        Product cupsAndCones = new Product("Cups & Cones", "바닐라, 초콜렛, Flavor of the Week",4.9);
        Product concretes = new Product("Concretes","쉐이크쉑의 쫀득한 커스터드와 다양한 믹스-인의 조합",5.9);
        Product shackAttack = new Product("Shack Attack","초콜렛 퍼지소스, 초콜렛 트러플 쿠키, Lumiere 초콜렛 청크와 스프링클이 들어간 진한 초콜렛 커스터드",5.9);
        frozenCustard.add(shakes);
        frozenCustard.add(shakeOfTheWeek);
        frozenCustard.add(redBeanShake);
        frozenCustard.add(floats);
        frozenCustard.add(cupsAndCones);
        frozenCustard.add(concretes);
        frozenCustard.add(shackAttack);

        Product shackmadeLemonade = new Product("Shack-made Lemonade","매장에서 직접 만드는 상큼한 레몬에이드(오리지날/시즈널)",3.9);
        Product freshBrewedIcedTea = new Product("Fresh Brewed Iced Tea","직접 유기농 홍차를 우려낸 아이스티", 3.4);
        Product fiftyfifty = new Product("Fifty/Fifty","레몬에이드와 아이스티의 만남",3.5);
        Product fountainSoda = new Product("Fountain Soda","코카콜라, 코카콜라 제로, 스프라이트, 환타 오렌지, 환타 그레이프",2.7);
        Product abitaRootBeer = new Product("Abita Root Beer","청량감 있는 독특한 미국식 무알콜 탄산음료",4.4);
        Product bottledWater = new Product("Bottled Water","지리산 암반대수층으로 만든 프리미엄 생수",1.0);
        drinks.add(shackmadeLemonade);
        drinks.add(freshBrewedIcedTea);
        drinks.add(fiftyfifty);
        drinks.add(fountainSoda);
        drinks.add(abitaRootBeer);
        drinks.add(bottledWater);

        Product shackMeisterAle = new Product("ShackMeister Ale","쉐이크쉑 버거를 위해 뉴욕 브루클린 브루어리에서 특별히 양조한 에일 맥주",9.8);
        Product magpieBrewingCo = new Product("Magpie Brewing Co.","설명 없음",6.8);
        beer.add(shackMeisterAle);
        beer.add(magpieBrewingCo);
    }

    public void ShowOption(int numbering){ //카테고리 메뉴선택 때만 보여줄 옵션 메뉴
        System.out.println("[ ORDER MENU ]");
        System.out.printf(numbering+". %-15s | %s\n", "Order", "장바구니를 확인 후 주문합니다.");
        System.out.printf(numbering+1+". %-15s | %s\n", "Cancel", "진행중인 주문을 취소합니다.");
    }

    public void ShowCategoryMenu() throws InterruptedException {
        int numbering = 1; //번호매김을 위한 변수
        int input;         //
        double totalPrice;
        Scanner sc = new Scanner(System.in);
        System.out.println("\"SHAKESHACK BURGER 에 오신 걸 환영합니다.\"");
        System.out.println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.\n");
        System.out.println("[ SHAKESHACK MENU ]");
        for (Menu item : categoryMenu) { // 카테고리 보여주기
            System.out.print(numbering + ". ");//번호매김 1. 2. 3. (카테고리 추가를 고려하여 numbering 사용)
            numbering++;
            item.Show();
        }
        ShowOption(numbering);  //옵션기능 보여주기 order/cancel

        input = sc.nextInt();
        if (0 < input && input < numbering) { //카테고리 범위 내 번호 선택 시
            System.out.print(categoryMenu.get(input - 1).getName()+"을/를 선택하셨습니다.");
        }
        else if (input == numbering) {//Order주문하기 선택 시
            System.out.println("아래와 같이 주문하시겠습니까?");
            System.out.println("[ Orders ]");
            totalPrice = order.getShoppingBag(); //장바구니에 담긴 내용물을 보여주고, 총가격 리턴받음
            System.out.println("[ Total ]");
            System.out.println("W " + totalPrice + "\n");
            System.out.println("1. 주문     2. 메뉴판");
            input = sc.nextInt();
            if (input == 1) {
                System.out.println("주문이 완료되었습니다!");
                System.out.println("대기번호는 [ " + order.CompleteOrder() + " ]번 입니다."); //장바구니를 비우고, 대기번호 리턴받음
                System.out.println("(3초 후 메뉴판으로 돌아갑니다.)");
                Thread.sleep(1000);
                System.out.println("(2초 후 메뉴판으로 돌아갑니다.)");
                Thread.sleep(1000);
                System.out.println("(1초 후 메뉴판으로 돌아갑니다.)");
                Thread.sleep(1000);
            }
            if (input == 2) {
                System.out.println("(주문이 완료되지 않았습니다. 메뉴판으로 돌아갑니다.)");
                Thread.sleep(1000);
            }

        } else if (input == numbering+1) {//Cancel취소하기 선택시
            System.out.println("진행하던 주문을 취소하겠습니까?");
            System.out.println("1. 확인     2. 취소");
            input = sc.nextInt();
            if (input == 1) {
                order.CancelOrder();
                System.out.println("진행하던 주문이 취소되었습니다. 이전 화면으로 돌아갑니다.");
                Thread.sleep(1000);
            }
            if (input == 2) {
                System.out.println("주문이 취소되지 않았습니다. 이전 화면으로 돌아갑니다.");
                Thread.sleep(1000);
            }

        }

    }
    public void Display() throws InterruptedException {
        ShowCategoryMenu();
    }
}
profile
공부노트

0개의 댓글