java - buyer 예제

imjingu·2023년 8월 24일
0

개발공부

목록 보기
410/481
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 + "점 입니다.");
		
	}

}

0개의 댓글