꿈 : 멋진 개발자 🧸/Java

[자바/Java] 자바의 정석_매개변수의 다형성

hyeya_ 2022. 5. 4. 13:28
class Product { //조상클래스
	int price; //제품의 가격
	int bonusPoint; //제품구매 시 제공하는 보너스 점수
	
	Product(int price) {
		this.price = price;
		bonusPoint= (int)(price/10.0); //보너스점수는 제품가격의 10%
	}
}

class Tv1 extends Product { //Product의 자손클래스 Tv1
	Tv1() {
		//조상클래스의 생성자 Product(int price)를 호출한다.
		super(100); //Tv의 가격을 100만원으로 한다.
	}

	@Override //object클래스의 toString을 오버라이딩한다.
	public String toString() {	return "Tv";	}
}

class Computer extends Product { //Product의 자손클래스 Computer
	Computer() { super(200); }

	@Override
	public String toString() { return "Computer";}
	
}

class Buyer { //고객,물건을 사는 사람
	int money = 1000; //소유금액
	int bonusPoint = 0; //보너스점수
	
	void buy(Product p) { 
		if(money<p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		money -= p.price;  			//가진 돈에서 구입한 제품의 가겨을 뺀다. 
		bonusPoint += p.bonusPoint; //제품의 보너스 점수를 추가한다.
		System.out.println(p+"을/를 구입하셨습니다.");
	}
	
}

public class Ex7_8 {
	public static void main(String[] args) {
		Buyer b = new Buyer();
		
		Product p = new Tv1();  //조상타입의 참조변수p로 자손타입 객체인 Tv1를 다룰 수 있다(다형성)
		b.buy(p);				//위 두 문장을 아래 한 문장으로 코드작성한 것이다
//		b.buy(new Tv1()); 		//buy(product p)
		
		b.buy(new Computer());  //buy(product p)
		
		System.out.println("현재 남은 돈은"+b.money+"만원입니다.");
		System.out.println("현재 보너스점수는"+b.bonusPoint+"점입니다.");
		
		
	}

}

 

class Product2 {
	int price;
	int bonusPoint;
	
	Product2(int price) { //매개변수가 1개인 생성자
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
	
	Product2 () {}		  //기본생성자
}

class Tv2 extends Product2 {
	Tv2(){ super(100);}

@Override //최고조상 object의 메서드인 toString을 구현부 내용만 수정하여 오버라이딩 한 것이다.
	public String toString() {	return "Tv"; }
}

class Computer2 extends Product2 {
	Computer2(){super(200);}
	public String toString() { return "Computer"; }
}

class Audio2 extends Product2{
	Audio2(){ super(50); }
	public String tostring() { return "Audio"; }
}

class Buyer2 { 							//고객, 물건을 사는사람
	int money = 1000;					//소유금액
	int bonusPoint = 0; 				//보너스점수
	Product2[]cart = new Product2[10];  //구입한 제품을 저장하기 위한 배열
	int i = 0; 						  	//Product배열에 사용될 카운터
	
	void buy(Product2 p) { 	//buy메서드
		if(money<p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		
		money -= p.price;
		bonusPoint += p.bonusPoint;
		cart[i++] = p;
		System.out.println(p.toString()+"을/를 구입하셨습니다.");
	}
	
	void summary() {		 //구매한 물품에 대한 정보를 요약해서 보여주는 메서드
		int sum = 0;		 //구입한 물품의 가격합계
		String itemList = "";//구입한 물품목록
		
		//반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
		for(i=0; i<cart.length;i++) {
			if(cart[i]==null) {break;}
			sum += cart[i].price;
			itemList += cart[i] + " ,";
		}
		System.out.println("구입하신 물품의 총 금액은 " +sum+"만원입니다");
		System.out.println("구입하신 제품은"+itemList+"입니다.");
	}
}

public class Ex7_9 {
	public static void main(String[] args) {
	Buyer2 b = new Buyer2();
	
	b.buy(new Tv2());
	b.buy(new Computer2());
	b.buy(new Audio2());
	b.summary();
	
	}
}