<aside> 💡 Github 주소
https://github.com/yeonssu/BurgerQueen-ordersysetm
</aside>
addToCart()로 장바구니에 상품을 담을 때, 새로운 객체를 생성해서 담는 게 아니라 각 상품 객체의 참조값을 장바구니에 그대로 담는다(깊은 복사가 아닌 얕은 복사가 이루어진다)
얕은 복사 : 객체의 참조값을 복사하는 것
Product newProduct = product;
//product가 저장하고 있는 힙메모리의 주소값과
//newProduct의 주소값은 같다 (동일한 객체를 가리키고 있다)
깊은 복사 : 참조값이 다른 새로운 객체를 생성하여 복사하는 것, 복제
Product newProduct = new Product(product.getId, product.getName,...);
//product와 newProduct가 서로 다른 참조값을 할당하고 있다
깊은 복사를 위해 Hamburger, Side, Drink의 복제역할 생성자를 각각 만들어준다(오버로딩)
//Hamburger클래스 내부에 작성
public Hamburger(Hamburger hamburger) {
super(hamburger.getName(), hamburger.getPrice(), hamburger.getKcal());
this.isBurgerSet = hamburger.isBurgerSet();
this.burgerSetPrice = getBurgerSetPrice();
}
======================================================
//Side클래스 내부에 작성
public Side(Side side) {
super(side.getName(), side.getPrice(), side.getKcal());
this.ketchup = side.getKetchup();
}
======================================================
//Drink클래스 내부에 작성
public Drink(Drink drink) {
super(drink.getName(), drink.getPrice(), drink.getKcal());
this.hasStraw = drink.hasStraw();
}
addToCart()에서 새로운 객체를 생성하여 items에 추가한다
Product newProduct;
if(product instanceof Hamburger) newProduct = new Hamburger((Hamburger) product);
else if(product instanceof Side) newProduct = new Side((Side) product);
else if(product instanceof Drink) newProduct = new Drink((Drink) product);
else newProduct = product;
//BurgerSet는 composeSet()에서 새로운 BurgerSet을 만들어 리턴하므로 새로운 인스턴스를 만들 필요가 없다
Product[] newItems = new Product[items.length + 1];
System.arraycopy(items, 0, newItems, 0, items.length);
newItems[newItems.length - 1] = newProduct; // product를 추가하지않고 새로만든 newProduct를 추가
items = newItems;
composeSet()에서도 새로운 Side, Drink인스턴스를 만들도록 코드를 수정한다
→ 사용된 side를 newSide로, drink를 newDrink로 변경
Order클래스 정의
주문은 장바구니에 담긴 상품을 기반으로 이루어진다
Cart객체와 생성자를 필드로 가져야한다
public class Order {
private Cart cart;
public Order(Cart cart){
this.cart = cart;
}
}
장바구니상품 주문 → makeOrder()