package chapter20230823.test05;
import java.util.*;
/*
수정
1) 구매한 물품을 저장하는 기능 추가
2) 구매한 물품에 대한 정보를 요약해서 보여주는 기능 추가
3) 환불 기능을 추가하기 위해 배열에서 ArrayList로 저장되는 데이터 타입을 변경
*/
public class Buyer { // 고객, 물건을 사는 사람
int money = 1000; // 소유금액
int bonusPoint = 0; // 보너스 점수
// Product[] products = new Product[10]; // 구입한 제품을 저장하기 위한 배열
// int i = 0; // Product배열에 사용될 카운터
ArrayList products = new ArrayList(); //구입한 제품을 저장하는데 사용될 ArrayLIst 객체
void buy(Product product) { //buy메서드, 부모 클래스 타입으로 매개변수 받음, 부모로 부터 제품들을 상속받아서 부모클래스만 있어도 사용 가능함
// 부모 클래스의 필드 사용, price, bonusPoint
if(money < product.price) { // price 형변환을 안해서 부모클래스에 있다는 것을 알수 있음.
System.out.println("잔액이 부족하여 물건을 살수 업습니다.");
return;
}
money -= product.price; // 가진돈에서 구입한 제품의 가격을 뺀다
bonusPoint += product.bonusPoint; // 제품의 보너스 점수를 추가한다
// products[i++] = product; // 제품을 Product[] products에 저장한다
products.add(product); // 구입한 제품을 ArrayList에 저장한다
System.out.println(product + "을/를 구입하셨습니다.");
}
void refund(Product product) { // 구입한 제품을 환불한다
if(products.remove(product)) { // 제품을 ArrayList에서 제거한다
money += product.price;
bonusPoint -= product.bonusPoint;
System.out.println(product + "을/를 반품하셨습니다.");
}
else { // 제거에 실패한 경우
System.out.println("구입하신 제품 중 해당 제품이 없습니다.");
}
}
void summary() { // 구매한 물품에 대한 정보를 요약해서 보여준다
int sum = 0; // 구입한 물품의 가격 합계
String itemList = ""; // 구입한 물품 목록
if(products.isEmpty()) { // ArrayList가 비어 있는지 확인한다
System.out.println("구입하신 제품이 없습니다.");
return;
}
for(Object object : products) {
Product product = (Product)object;
sum += product.price;
itemList += product + ", ";
}
System.out.println("구입하신 물품의 총 금액은 " + sum + "만원 입니다.");
System.out.println("구입하신 제품은 " + itemList + " 입니다.");
// 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
// 1) for 이용
// for(int i =0; i < products.length; i++) {
// if(products[i] == null)
// break;
// sum += products[i].price;
// itemList += products[i] + ", ";
// }
// 2) foreach 이용
// for(각 요소의 타입과 요소를 담을 변수 : 배열 또는 컬렉션)
// for(Product product : products) {
// if(product != null)
// sum += product.price;
// itemList += product + ", ";
// }
// 3) 반복을 줄이기 위해 인스턴스 변수 i 사용
// for(int i = 0; i < this.i; i++) { // this.i는 int i = 0; // Product배열에 사용될 카운터 요거임
// sum += products[i].price;
// itemList += products[i] + ", ";
// }
// System.out.println("구입한 물건 가격의 총 합계는 " + sum + " 원 입니다.");
}
}
package chapter20230823.test05;
public class Audio extends Product{
Audio() {
super(50);
}
@Override
public String toString() {
return "Audio";
}
}
package chapter20230823.test05;
public class Computer extends Product{
Computer() {
super(200);
}
@Override
public String toString() {
return "Computer";
}
}
package chapter20230823.test05;
public class Product {
int price; // 제품의 가격
int bonusPoint; // 제품구매시 제공하는 보너스 점수
Product(int price) {
this.price = price;
this.bonusPoint = (int)(price / 10.0); // 보너스 점수는 제품가격의 10%
}
}
package chapter20230823.test05;
public class Tv extends Product{
Tv() {
// 조상클래스의 생성자 Product(int price)를 호출한다
super(100); // Tv의 가격을 100만원 으로 한다
}
@Override
public String toString() {
return "Tv";
}
}
package chapter20230823.test05;
public class Test {
/*
코딩 순서 : Product -> Tv -> Computer -> Buyer -> Test
*/
public static void main(String[] args) {
/*
환불 기능 추가 및 리스트를 이용한 데이터 저장
Buyer 클래스의 환불 기능을 추가하기 위해 배열에서 ArrayList로 저장되는 데이터 타입을 변경
*/
Buyer b = new Buyer();
Tv tv = new Tv();
Computer com = new Computer();
Audio audio = new Audio();
b.buy(tv);
b.buy(com);
b.buy(audio);
b.summary();
System.out.println();
b.refund(com);
b.summary();
// Buyer buyer = new Buyer();
//
// buyer.buy(new Tv());
// buyer.buy(new Computer());
// buyer.buy(new Audio());
//
// buyer.summary();
//
// System.out.println();
// System.out.println("현재 남은 돈은 " + buyer.money + "만원 입니다.");
// System.out.println("현재 보너스점수는 " + buyer.bonusPoint + "점 입니다.");
}
}