문제
다음은 물건을 구입하는 사람을 정의한 Buyer클래스이다. 이 클래스는 멤버변수로 돈(money)과 장바구니(cart)를 가지고 있다. 제품을 구입하는 기능의 buy메서드와 장바구니에 구입한 물건을 추가하는 add메서드, 구입한 물건의 목록과 사용금액, 그리고 남은 금액을 출력하는 summary메서드를 완성하시오.
기능 : 지정된 물건을 구입한다. 가진 돈(money)에서 물건의 가격을 빼고, 장바구니(cart)에 담는다.
만일 가진 돈이 물건의 가격보다 적다면 바로 종료한다.
반환타입 : 없음
매개변수 : Product p - 구입할 물건
기능 : 지정된 물건을 장바구니에 담는다.
만일 장바구니에 담을 공간이 없으면, 장바구니의 크기를 2배로 늘린 다음에 담는다.
반환타입 : 없음
매개변수 : Product p - 구입할 물건
기능 : 구입한 물건의 목록과 사용금액, 남은 금액을 출력한다.
반환타입 : 없음
매개변수 : 없음
[지정된 main함수]
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
b.buy(new Tv());
b.buy(new Audio());
b.buy(new Computer());
b.buy(new Computer());
b.buy(new Computer());
b.summary();
}
[실행결과]
잔액이 부족하여 Computer을/를 살 수 없습니다.
구입한 물건 : Tv, Computer, Tv, Audio, Computer, Computer,
사용한 금액 : 850
남은 금액 : 150
문제구현
public class PolyTest {
public static void main(String[] args) {
Buyer b = new Buyer();
b.buy(new Tv());
b.buy(new Computer());
b.buy(new Tv());
b.buy(new Audio());
b.buy(new Computer());
b.buy(new Computer());
b.buy(new Computer());
b.summary();
}
}
class Buyer {
int money = 1000;
Product[] cart = new Product[3]; // 구입한 제품을 저장하기 위한 배열
int i = 0; // Product배열 cart에 사용될 index
int sum; // 장바구니 안의 가격을 더해줄 변수
void buy(Product p) {
if (money < p.price) {
System.out.println("잔액이 부족하여 " + p + " 을/를 살 수 없습니다. ");
} else {
money = money - p.price;
add(p);
sum += p.price;
}
}
void add(Product p) {
if (i >= cart.length) {
Product[] newCart = new Product[(cart.length * 2)];
for (int i = 0; i < cart.length; i++) {
newCart[i] = cart[i];
}
cart = newCart;
//System.out.println("cart 주소: " + cart);
//System.out.println("newcart 주소: " + newCart);
cart[i] = p;
i++;
} else {
cart[i] = p;
i++;
}
}
void summary() {
// System.out.print("구입한 물건: ");
// for (i=0; i < cart.length; i++) {
// System.out.print( cart[i] + " , ");
// } 이 코드를 간결하게 표현 가능한 toString()
System.out.println("구입한 물건: " + Arrays.toString(cart));
System.out.println("사용한 금액 : " + sum);
System.out.println("남은 금액: " + money);
}
}
class Product {
int price; // 제품의 가격
public Product(int price) {
this.price = price;
}
}
class Tv extends Product {
Tv() {
super(100);
}
public String toString() {
return "Tv";
}
}
class Computer extends Product {
Computer() {
super(200);
}
public String toString() {
return "Computer";
}
}
class Audio extends Product {
Audio() {
super(50);
}
public String toString() {
return "Audio";
}
}
에러사항 및 알게된거
=
연산자의 의미void add(Product p) {
if (i >= cart.length) {
Product[] temp = cart;
cart = new Product[i * 2];
cart = temp;
} else {
cart[i] = p;
i++;
}
}
나는 위 코드를 Buyer class 안에 상품을 장바구니에 담는 메서드로 구현을 한것인데,
actual case에서 볼 수 있듯이 배열에서의 = 연산자는 그저 주소값을 참조한다는 뜻이다. 그래서 실제 배열값을 복사하기 위해선 자바에서 만들어 놓은 배열복사 함수를 사용하거나, 코드로 구현해주어야한다.
void add(Product p) {
if (i >= cart.length) {
Product[] newCart = new Product[cart.length * 2];
for (int i = 0; i < cart.length; i++) {
newCart[i] = cart[i];
}
cart = newCart;
} else {
cart[i] = p;
i++;
}
}