★장바구니 기능 구현
Cart클래스에 기능을 구현해야한다
장바구니 담기 - addToCart() / 옵션 고르게 하기 - chooseOption() , 햄버거세트 구성하기 - composeSet()
장바구니 출력하기 - printCart()
🌼 필드 정의
Cart객체는 장바구니역할이고 담긴 상품을 저장하고있어야한다
items필드를 선언하고 초기화 후 여러메서드에서 사용자의 입력을 받을 예정이니
필드로 Scanner를 정의해준다
🌼 메서드 정의
🌼printCart()
장바구니 상품을 출력해주는 기능 반환값필요x
items를 매개변수로 받지 않아도 됨 입력값필요x
start()메서드가 호출하려면 접근제어자가 public
장바구니 상품과 옵션정보 출력 메서드 - printCartItemDetails()
금액합계 계산 - calculateTotalPrice()
★printCartItemDetails()
입력값 : Cart클래스의 필드인 items를 출력할것이므로 입력값필요x
반환값: 단순출력메서드 반환값필요x
접근범위 : Cart 내부(printCart()메서드) 내에서만 호출할것이므로 private
의사코드
for (Product product: items) {
if (product가 BurgerSet의 인스턴스라면) 세트 정보 출력
else if (product가 Hamburger의 인스턴스라면) (단품) 출력
else if (product가 Side의 인스턴스라면) 케첩 개수 출력
else if (product가 Drinks의 인스턴스라면) 빨대 유무 출력
}
((Drink) product).hasStraw() ? "있음" : "없음"
(BurgerSet) (Side) (Drink) 참조변수 다운 캐스팅을 하는 이유
items는 Product[]타입의 배열이지만 items[n]은 본래 Hamburger,Side,Drink,BurgerSet타입의 인스턴스이다
new Product() X new Hamburger() ...등을 통해 인스턴스화된 인스턴스
items[n]들은 Products[]타입의 배열에 할당되면서 업캐스팅되어있는 상태
업캐스팅의 상태에서는 상위클래스의 필드와 메서드로만 접근이 가능하다
Product타입의 product를 통해서 hasStraw() , getKetchup() 등 하위클래스를 호출할 수 없다
그래서 다시 사용하려면 다운캐스팅을 해주어야한다
★ calculateTotalPrice()
배열을 순회하면서 금액합계를 구하는 메서드 입력값x
합계를 구하는 메서드여서 반환값 필요
printCart 내에서 사용 private 타입은 int
🌼addToCart()
상품을 선택하고 나서 실행되는 메서드이며 옵션 선택,세트구성을 해주어야한다
입력값 : 메뉴상품을 고를경우 id를 입력값으로 받음
반환값 : items 필드에 상품을 추가하는거라서 필요없음
접근범위 : OrderApp에 호출해주어야 하므로 public
public void addToCart(int productId) {}
productID를 통한 product 검색
findById()
상품을 Items에 담으려면 입력값으로 받은 productId를 id값으로 가지는 상품을 찾아야한다
상품정보가 있는 클래스(ProductRepository)의 인스턴스를 Cart 클래스의 필드로 정의,생성자로 초기화
addToCart()에 상품을 검색하는 코드 ( products를 순회하면서 id값이 일치하는 것을 찾기)
객체지향적 코드는 객체간 결합도가 낮아야하고 그러려면 객체의 자율성이 필요하다 = 능동적으로 자신의 역할을 수행하는 객체
상품을 검색하는 코드가 addToCart()에서 수행되는게 아닌
상품정보를 저장하고 해당상품정보에 접근하는 역할을 가진 productRepository가 수행하게 만들어야한다
그리고 Cart에서 그 메서드를 호출하면 된다.
세부적 동작을 내부로 감추는것을 캡슐화라고 한다.
- 상품 옵션 설정
chooseOption()
🍮 chooseOption() 먼저 작성하고 입력
검색한 product에 옵션을 설정해주는 메서드
메서드를 정의하고 호출메서드를 넣기
- 세트구성
composeSet()
🍮composeSet() 먼저 작성하고 입력
세트일 경우 세트를 구성해주는 메서드
햄버거세트는 햄버거를 중심으로 추가선택해서 만들어진다 사용자가 선택한 햄버거를 인자로 전달
product를 Hamburger타입으로 다운캐스팅하여 전달하면서 composeSet()를 호출
햄버거세트를 구성해서 반환해주므로 반환값은 product에 할당
🌼chooseOption()
특정 상품에 대해서 옵션을 선택할 수 있게 해주는 역할
메서드 시그니처
입력값 : 상품을 입력값으로 받아옴
반환값 : Setter를 통해 값을 변경하기때문에 반환값 필요x
접근범위 : addToCart() 내에서만 호출될것이므로 private
의사코드
private void chooseOption(Product product) {
String input;
if (product가 Hamburger의 인스턴스라면) {
"단품으로 주문하시겠어요? (1)_단품(XXXX원) (2)_세트(XXXX원)" 출력
input = 사용자 입력
if (input이 2라면) product의 isBurgerSet을 true로 바꿈
}
else if (product가 Side의 인스턴스라면) {
"케첩은 몇 개가 필요하신가요?" 출력
input = 사용자 입력
product의 ketchup에 input 할당
}
else if (product가 Drink의 인스턴스라면) {
"빨대가 필요하신가요? (1)_예 (2)_아니오"
input = 사용자 입력
if (input이 2라면) product의 hasStraw를 false로 바꿈
}
}
설정하고 상품옵션설정으로 돌아가기
🌼composeSet()
햄버거 세트를 구성해주는 역할
사이드 메뉴를 보여주고 입력받기 / 사이드메뉴 옵션 보여주고 입력받기
음료메뉴 보여주고 입력받기 / 음료메뉴의 옵션 보여주고 입력받기
선택한대로 세트를 구성해서 세트를 반환하기
입력값 : 햄버거는 입력값으로 받아와야한다
반환값 : 세트
접근범위 : 동일 클래스 내에서만 접근 private
의사코드
메뉴를 부분적으로 보여줘야해서 Menu 인스턴스를 필드로 정의해야한다
★ Cart 클래스의 필드로 menu를 정의하고 생성자를 수정
private BurgerSet composeSet(Hamburger hamburger) {
"사이드를 골라주세요" 출력
사이드 메뉴 출력
String sideId = 사용자 입력 받기
Side side = sideId를 id로 가지는 상품 검색
사이드 옵션 선택
"음료를 골라주세요." 출력
음료 메뉴 출력
String drinkId = 사용자 입력 받기
Drink drink = drinkId를 id로 가지는 상품 검색
드링크 옵션 선택
String name = hamburger의 이름 + "세트";
int price = hamburger의 BurgerSetPrice필드의 값
int kcal = 햄버거, 사이드, 드링크의 칼로리 총합
return new BurgerSet(name, price, kcal, hamburger, side, drink);
}
BurgerSet 생성자 수정
미리 등록된 상품이 아니라서 식별을 위한 id값을 전달할 필요 없기때문에 제거
★ printSides()와 printDrinks() 조건 분기
사이드와 음료에 가격이 표기되어야한다
코드를 재사용하면서 구현하려면 코드내에서 조건을 통해 실행흐름을 분기시켜주고
전체메뉴를 출력할때와 세트를 구성할때 부분적 출력이 다르게 작성해야한다.
호출되는 곳의 매개변수 printPrice도 추가해주고 printEachMenu의 인자로 전달해준다
전체메뉴를 출력하는곳에는 true값 입력
★ 장바구니에 상품추가
items 배열에 새로운 요소 추가
배열의 길이를 1만큼 확장한 새로운 배열 / 기존배열의 요소를 새로운 배열로 복사
마지막요소에 새로운 product를 할당 / items에 새로운 배열을 할당
🌼OrderApp 코드 작성
Cart클래스를 인스턴스화
'실습👁️🗨️ > 연습' 카테고리의 다른 글
BurgerQueen 주문 프로그램 만들기 5 (0) | 2023.10.29 |
---|---|
BurgerQueen 주문 프로그램 만들기 4 (0) | 2023.10.29 |
BurgerQueen 주문 프로그램 만들기 2 (0) | 2023.10.28 |
BurgerQueen 주문 프로그램 만들기 1 (0) | 2023.10.27 |
김밥 키오스크 + (0) | 2023.10.25 |