My Melody Is Cute BurgerQueen 주문 프로그램 만들기 2
본문 바로가기

실습👁️‍🗨️/연습

BurgerQueen 주문 프로그램 만들기 2

🌼주문 프로그램 로직 만들기

(프로그램 흐름의 구성 계획)

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

메뉴선택 - 옵션선택 - 장바구니담기 - 다시 메뉴 출력

장바구니를 누른 경우 - 장바구니 출력 - 다시 메뉴 출력

주문하기를 누른 경우 주문내역 출력 - 프로그램 종료

 

🌼의사코드 작성

OrderApp  클래스에 의사코드를 작성하고

메인클래스의 main메서드에서 OrderApp 인스턴스를 생성 후

start()메서드를 실행시키면 프로그램이 실행이 된다

 

왜 Main 클래스의 main메서드에 로직 코드를 넣지 않을까?

main 메서드의 접근자는 static 인데 메서드앞에 static이 붙으면 인스턴스가 아니라 클래스에 속하는 메서드 정적 메서드가 된다

정적메서드는 클래스를 인스턴스화 하기전에 호출이 될수 있지만 인스턴스변수를  참조할 수 없다.

이후의 코드에서 인스턴스 필드를 활용해야하는데 main메서드에 모든 프로그램 로직을 작성하면

main클래스에 정의한 모든 인스턴스 필드들을 활용할 수 없다

그래서 별도의 클래스인 OrderApp을 만들었고 start() 메서드에 프로그램의 모든 로직을 작성하는것이다

 

 

🌼프로그램의 기능 분산시키기

OrderApp의 주요 동작들의 주체 3개 = 객체 3개

메서드를 관련있는것 끼리 묶는 것 - 객체지향적인 원리

 

1. Menu - 메뉴출력 printMenu()

2. Cart - 장바구니 담기 addToCart()

옵션 고르게 하기(햄버거와 세트옵션이면 햄버거세트 구성) chooseOption() , composeSet()

장바구니 출력 printCart()

3. Order - 주문하기(주문내역 출력) makeOrder()

 

🌼필드 정의

메뉴클래스에 메뉴 출력기능 넣기

메뉴 출력을 하려면 전체상품에 대한 정보를 가지고 있어야 한다

Product[] 타입의 변수 products를 인스턴스 필드로 선언하고 생성자만들기

 

인자로 ProductRepository의 products를 전달해야하는데 private 접근제어자가 지정되어있어서

외부에서 products에 접근가능한 역할을 하는 getter 메서드를 만들어준다

 

OrderApp의 start() 메서드에서 ProductRepository를 인스턴스화 하고

getAllProducts()의 반환값을 전달하면서 인스턴스화 시킨다.

그리고 요구사항의 출력코드도 넣는다

 

🌼메뉴기능 구현 메서드 정의

메서드의 역할이 무엇인지 명확히 하기 그래야 반환값과 입력값을 확실히 할 수 있다.

printMenu()

메뉴를 카테고리별로 출력,장바구니와 주문하기도 출력

입력값 : Menu클래스의 products 클래스 내에 정의할 것이므로 입력값이 필요없다

반환값 : 단순한 출력메서드라 반환값이 필요없다

OrderApp에서 호출할 것이므로 접근제어자는 public으로 설정

메뉴 정보를 출력할때 Menu 클래스의 products 필드를 반복문으로 순회하면서 카테고리에 맞는 상품을 출력해 주면 된다

그런데 각 요소가 무엇인지 어떻게 판단할 수 있을까?

instanceof 연산자를 사용하면 된다

instanceof연산의 결과는 좌항의 인스턴스를 우항의 타입으로 캐스팅 할 수 있는지의 여부를 의미

좌항과 우항의 클래스가 같거나 우항클래스의 하위클래스라면 true

좌항의 인스턴스를 우항의 클래스타입으로 캐스팅 할 수  있다

그렇지않다면 false

// 햄버거 객체 생성
Hamburger hamburger = new Hamburger(...);

hamburger instanceof Hamburger // true 
hamburger instanceof Product   // true
hamburger instanceof Side      // false

for-each 루프 배열 또는 컬렉션과 같은 반복가능한 객체를 순회하면서 요소를 접근하는데 사용

반복대상객체를 변수명에 저장하고 출력

for (요소의 타입 변수명 : 반복대상객체) { //반복동작 수행 }

어떤 상품이 햄버거클래스에 해당하는 제품이라면

printMenu()에서 중복되는 코드 메서드추출로 중복 제거하기

[Refactor] - [Extract Method]

나머지 메뉴들도 리팩토링 printHamburgers(),printSides(),printDrinks()

 

메뉴 출력기능 테스트

OrderApp클래스에 스캐너와 사용자입력메소드와 메뉴출력 메소드 입력