[Java의 정석]Chapter7.객체지향 프로그래밍2(29~30)

Hello_Wendy·2022년 5월 23일
0

자바의 정석

목록 보기
59/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

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

  • 조상타입의 참조변수로 자손타입의 객체를 참조하는 것이 가능하므로, Product클래스가 Tv, Computer, Audio클래스의 조상일 때 아래와 같이 할 수 있음
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
  • 위의 코드를 Product 타입의 참조변수 배열로 처리하면 아래와 같음
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();
  • 조상타입의 참조변수 배열을 사용하면, 공통의 조상을 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있음

  • 또는, 묶어서 다루고 싶은 객체들의 상속관계를 따져서 가장 가까운 공통조상 클래스 타입의 참조변수 배열을 생성해서 객체들을 저장하면 됨

  • 이 전 포스팅의 예제 7_8의 Buyer클래스에 구입한 제품을 저장하기 위한 Product배열을 추가해보자

class Buyer {
	int money = 1000;
    int bonusPoint = 0;
    Product[] cart = new Product[10]; //구입한 제품을 저장하기 위한 배열(카트)
    int i = 0; //Product배열 cart에 사용될 index
    
    void buy(product p) {
    	if(money < p.price) {
        	System.out.Println("잔액이 부족하여 물건을 살 수 없습니다.");
            return;
     }
     money -= p.price; //가진 돈에서 제품가격을 뺀다.
     bonusPoint += p.bonusPoint; //제품의 보너스 포인트를 더한다.
     cart[i++] = p; //제품을 product[] cart에 저장한다.
     System.out.println(p+"을/를 구입하셨습니다.");
     }
}

구입한 제품을 담기 위해 Buyer클래스에 Product배열인 cart 추가하고,buy메서드에 cart[i++]=p; 문장을 추가함으로써 물건을 구입하면, 배열 cart에 저장되도록 함
▶ 모든 제품 클래스의 조상인 Product클래스 타입의 배열을 사용함으로써 구입한 제품을 하나의 배열로 간단하게 다룰 수 있음

30. 여러 종류의 객체를 배열로 다루기 예제

class Product2 { 
	int price; //제품의 가격
	int bonusPoint; //제품 구매시 제공하는 보너스 점수
	
	Product2(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
	Product2() {} //기본생성자
}

class Tv2 extends Product2 { //조상클래스의 생성자. Product2(int price)를 호출
	Tv2() { super(100); }
	
	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;
	
	void buy(Product2 p) {
		if(money < p.price) {
			System.out.println("no more money.");
			return;
		}
		money -= p.price; //가진 돈에서 구입한 제품의 가격을 뺀다.
		bonusPoint += p.bonusPoint; //제품의 보너스 점수를 추가한다.
		cart[i++] = p; //제품을 Product[] cart에 저장한다.
		System.out.println(p + " you buy.");
	}
	void summary() { //구매한 물품에 대한 정보를 요약해서 보여준다.
		int sum = 0; //구입한 물품의 가격합계
		String itemList =""; //구입한 물품목록
	
		//반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
		for(int i = 0; i<cart.length; i++) {
			if(cart[i]==null)break;
			sum += cart[i].price;
			itemList += cart[i] + ","; //itemList +=(i==0) ? "" + cart[i] : ","+cart[i];와 같음
		}
		System.out.println("total sum is " + sum + " won");
		System.out.println("product is " + 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();
	}
}
  • 위 예제에서 Product2배열로 구입한 제품들을 저장할 수 있도록 했지만, 배열의 크기를 10으로 했기 때문에 11개 이상의 제품을 구입할 수 없는 것이 문제임(그렇다고, 배열의 크기를 무조건 크게 설정할 수만도 없는 일)

  • 이런경우, Vector클래스를 사용하면 됨.

  • Vector클래스는 내부적으로 Object타입의 배열을 가지고 있어서 이 배열에 객체를 추가하거나 제거할 수 있게 작성되고, 배열의 크기를 알아서 관리해주기 때문에 저장할 인스턴스의 개수에 신경쓰지 않아도 됨

Public class Vector extends AbstractList
		implements List, Cloneable, java.io.Serializable {
 	protected Object elementData[];
 	...
}
*Vector클래스는 단지 동적으로 크기가 관리되는 객체배열일 뿐
profile
안녕 나의 새로운 세상

0개의 댓글