자바의정석

[자바의 정석 - 기초편] ch7-29,30 여러 종류의 객체를 배열로 다루기

유호야 2022. 3. 21. 21:23
반응형

ch7-29 여러 종류의 객체를 배열로 다루기 

다형성의 장점

1) 다형적 매개변수 
매서드의 매개변수로 조상타입의 참조변수를 사용해서, 하나의 메서드로 여러 타입의 객체를 받을 수 있는 것 
2) 하나의 배열에 여러 종류 객체를 저장할 수 있다. 

- 조상 타입의 배열에 자손들의 객체를 담을 수 있다. 

 

 


처음에는 참조형 기본값 null 이 저장되며, 
참고로 Vector 클래스라는 것이 있는데

가변 배열 기능을 가지고 있는 클래스이다. 

Object[] 라는 멤버를 가지고 있고, 모든 종류의 객체를 저장할 수 있다. 
최고 조상인 Object 이기 때문에

배열의 단점은 한 번 배열의 길이를 작성하면, 길이를 변경할 수 없다는 것이지만 
Vector는 가변배열 기능 덕분에, 길이도 자유자재로 변경할 수 있다. 


package ch07;

class Product {
	int price;
	int bonuspoint;
	
	Product(int price){
		this.price = price; 
		this.bonuspoint = (int)(price*0.1);
	}
}

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 Computer2 extends Product2 {
	Computer2() {
		super(200);
	}
	
	public String toString() {
		return "Computer2";
	}
}

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 + "입니다.");
		System.out.println("현재 남은 돈은 "+ money + " 원 입니다. ");
		System.out.println("포인트 잔액은 "+ bonusPoint + "점입니다.");
		
	}
}

class Product2 {
	int price;
	int bonusPoint;
	
	Product2(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
}

class Buyer2 {
	int money = 1000;
	int bonusPoint = 0;
	Product2[] cart = new Product2[10];
	int i = 0;
	
	void buy(Product2 p) {
		if(money < p.price) {
			System.out.println("돈이 부족해서 구매할 수 없습니다.");
			return;
		}
		money -= p.price;
		bonusPoint += p.bonusPoint;
		cart[i++] = p;
		
		System.out.println("구매한 제품은 "+ p.toString() + "입니다.");
		System.out.println("현재 남은 돈은 "+ money + " 원 입니다. ");
		System.out.println("포인트 잔액은 "+ bonusPoint + "점입니다.");
	}
	
	void summary() {
		int sum = 0;
		String itemList = "";
		for(int i = 0; i < cart.length; i++) {
			if(cart[i] != null) {
				itemList += (cart[i] +", ");
				sum += cart[i].price;
			}
		}
		
		System.out.println("구매내역: " + itemList + "입니다.");
		System.out.println("총 가격: " + sum + "만원 입니다.");
	}
	
}

class Tv2 extends Product2 {
	int price = 1000;
	int bonusPoint = (int)(price*0.1);
	
	Tv2() {
		super(200);
	}
	
	public String toString() {
		return "TV2";
	}
}

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

public class Ex7_8 {
	
	public static void main(String args[]) {
		Buyer2 b = new Buyer2(); // cart 배열을 만들고
		
		b.buy(new Tv2());
		b.buy(new Computer2());
		b.buy(new Audio2());
		b.summary();
	}
	
}
반응형