여러 종류의 객체를 하나의 배열로 다루기

이정민·2021년 10월 28일
0

객체를 하나의 배열로 다루기 (1)

//class 배열만들기
---------------------------------------
				->	Product p[] = new Product[3]; //객체배열 생성
Product p1 = new Tv();		->	p[0] = new Tv();
Product p2 = new Computer();	->	p[1] = new Computer();
Product p3 = new Audio();	->	p[2] = new Audio();

//다른 방법
Product[] p = { new Tv(), new Computer(), new Audio };


//기본 배열 만들기
---------------------------------------
//방법 1
int[] array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;

//방법 2 (선언과 동시에 배열의 크기 지정 및 값 초기화)
int[] array1 = new int[] {1,2,3};

//방법 3 (선언과 동시에 배열의 크기 지정 및 값 초기화)
int[] array2 = {1,2,3};

//방법 4 (선언 후 기본변수에 값 초기화)int는 기본변수 Product는 참조변수
int[] array3;
array3 = {1,2,3}; // 에러
array3 = new int[]{1,2,3};

---------------------------------------


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

				->	Product p[] = new Product[3]; //객체배열 생성
Product p1 = new Tv();		->	p[0] = new Tv();
Product p2 = new Computer();	->	p[1] = new Computer();
Product p3 = new Audio();	->	p[2] = new Audio();

여기서 배열에는 실제 객체를 저장하는게 아니라 참조변수(Product)를 저장하기 위한 것

배열의 각 요소에는 인스턴스의 주소값(Tv, Computer, Audio)이 저장된다.

위에 배열을 적용한 코드


package chapter7;

      public class Example1_Buyer {

         public static void main(String[] args) {
		
            class Product {
               String name = ""; //제품이름
               int price;	//제품가격
               int bonusPoint;	//보너스 점수
			
               Product(String name, int price, int bonusPoint){	//생성자
                  this.name = name;
                  this.price = price;
                  this.bonusPoint = bonusPoint;
               }
            }
-----------------------------------------------------//class Tv


            class Tv extends Product {
            
               Tv() {
                  this("jmTV",500,50);	//밑에 있는 생성자 호출
               }

               Tv(String name, int price, int bonusPoint) {
                  super(name, price, bonusPoint);	// 조상 생성자 호출
               }
            }
            
-----------------------------------------------------//class Computer


            class Computer extends Product {
            
               Computer() {
                  this("jm컴퓨터",200,20);	//밑에 있는 생성자 호출
               }

               Computer(String name, int price, int bonusPoint) {
                  super(name, price, bonusPoint);	// 조상 생성자 호출
               }
            }
            
-----------------------------------------------------//class Buyer

            class Buyer {	//물건 사는 사람
               int money = 1000;	//소유금액
               int bonusPoint = 0;	//보너스점수
	       Product[] cart = new Product[10]; //장바구니, cart배열 생성
               
               int i=0;
			
               void buy(Product p) {	<---- //자손타입의 인스턴스 넘겨 줄 수 있다!!!
                  money = money - p.price;
                  bonusPoint += p.bonusPoint;
                  cart[i++] = p; // 인스턴스가 넘겨지면 cart배열에 저장
               }
            }
		
=======================================================//결과 확인

            Buyer b = new Buyer();		//Buyer 인스턴스 생성
            System.out.println(b.money);	// 소유금액 1000원
		
		
            Tv tv = new Tv();			//Tv 인스턴스 생성
            Computer com = new Computer();	//Com 인스턴스 생성
            
            
            
            b.buy(tv);	//buy메서드에 tv인스턴스를 넣어서 호출
            System.out.println("소지금 : "+b.money);		//소지금 : 500
            System.out.println("보유 보너스 : "+b.bonusPoint);	//보유 보너스 : 50
            
            
            
            b.buy(com);	//buy메서드에 com인스턴스를 넣어서 호출
            System.out.println("소지금 : "+b.money);		//소지금 : 300
            System.out.println("보유 보너스 : "+b.bonusPoint);	//보유 보너스 : 70
            
            System.out.println(b.cart[0].name); 		// jmTV
            System.out.println(b.cart[1].name); 		// jm컴퓨터


        }

   }

java.util.Vector (객체 저장 클래스)

모든 종류의 객체들을 저장할 수 있는 클래스


public class Vector extends AbstractList implements List, Cloneable, java.io.Serializable {

   protected Object elementData[];
   ...
}

Vector 클래스는 위와 같이 내부적으로 Object 타입의 객체 배열을 가지고 있어서 어떠한 종류의 개체도 담을 수 있다.
(Object 클래스는 모든 클래스의 조상이고 조상의 타입으로 자손 인스턴스를 참조할 수 있기 때문에)

Vector클래스는 Object배열을 자동적으로 관리해주기 때문에 배열을 직접 관리해줄 필요 없이 객체를 Vector에 저장하고 읽어오는 메서드만 사용하면 된다.

Vector 클래스의 주요 메서드

  • Vector()

    Vector 클래스의 기본 생성자
    기본적으로 10개의 객체를 저장할 수 있는 인스턴스 생성
    10개 이상으로 저장 시 자동적으로 크기가 증가된다.


  • boolean add(Object o)

    Vector에 객체를 저장하는 메서드
    매개변수가 Object 타입의 참조변수라서 어떤객체도 매개변수로 사용할 수 있다.
    (어떤타입의 객체든지 저장할 수 있다.)
    리턴값은 boolean이기 때문에 저장에 성공하면 true 등 리턴 함


  • boolean remove(Object o)

    Vector에 저장되어 있는 객체를 제거한다.
    나머지는 add메서드와 같다.


  • boolean isEmpty()

    Vector가 비어있는지 검사.
    비어있으면 True, 아니면 False


  • Object get(int index)

    인덱스를 통해서 지정된 위치의 객체를 반환한다.
    3이면 4번째로 저장된 객체가 반환된다.


  • int size()

    Vector에 실제로 저장된 객체의 개수를 정수로 반환한다.

Vector클래스를 이용해서 바꾼 코드

Prodcut[] cart = new Product[10];

void buy(product p) {
   cart[i++] = p;
}

-----------------------------------

Vertor cart = new Vector();

void buy(Product p) {
   cart.add(p);
}

구입한 제품의 목록을 출력해주는 코드

profile
안녕하세요.

0개의 댓글