반응형

다형성의 장점에 대해서 공부하고 있는데,
저번시간에 다형성의 장점은 2가지가 있다고 했는데,

  • 다형적 매개변수
  • 하나의 배열에 여러 종류 객체저장 

저번시간에 는 다형적 매개변수라는 장점에 대해서 알아보았고,
오늘은 두번째 장점인, 하나의 배열에 여러 종류 객체 저장이라는 장점에 대해서 알아보자.


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

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

 

보통 하나의 배열에는 같은 타입만 저장이 가능하다.
그러나 다형성을 이용하면, 하나의 배열에 여러 종류의 객체를 저장할 수 있다. 

 

전시간에 봤던 것 처럼, Product는 Tv, Computer, Audio등 제품의 조상이다.
Tv, Computer, Audio는 자손이다.
이것들을 p1, p2, p3에 생성해서 담았다.

이것을 배열로 바꾸면, 오른쪽 코드처럼 된다. 
죄측코드와 우측코드를 각각 그림으로 구조를 그려보면 위의 그림처럼 표현할 수 있다.

좌측코드에서 변수 3개를 우측에서는 하나의 배열에 묶어놓은 것이다.

결국, 우측코드를 보면, 
Product라는 타입의 배열 p에는 Product타입의 객체만 넣을 수 있을 것 같지만,
다형성 때문에 Product의 자식타입 객체도 넣을 수 있다.

즉, Product배열 p에는 여러종류의 객체가 담겨있다.

이것이 다형성의 장점이다.

 

 

예제를 보자, Buyer의 멤버로 cart(장바구니)를 추가했다.
것을 Product배열로 하면 된다.
그럼 이 cart장바구니에는 여러 종류의 물건들을 담을 수 있다.

만약에, 이 방법을 사용하지 않으면, 모든 물건의 배열이 따로따로 생겨야 할 것이다. (한 물건을 몇개 살지 모르기 때문, 제품종류가 많기때문)

그러나, 다형성의 장점으로 인해, 하나의 배열에 여러 종류의 객체를 담을 수 있다.

처음에 Cart배열이 만들어지면, 참조형의 기본형은 null이므로 null이 저장된다.

 

그런데, 물건을 사면, 구매한 물건을 가리키는 참조변수에 저장된 주소값이 Cart배열에 저장되게 된다.

 

 

참고로, 가변 배열이 가능한 Vector클래스가 있다.
가변배열 기능을 가지고 있는 클래스이다.

Vector클래스에는 Object elementData[]라는 Objcect배열을 멤버로 가지고 있다. 
Object는 최고 조상이기 때문에 Object배열은모든 종류의 객체를 전부 저장할 수 있다.

그래서, 이 Vector클래스에는 모든 종류의 객체를 저장할 수 있다.

게다가 이 클래스의 장점은 뭐냐면, 
원래는 우리가 배열의 길이를 직접 관리해 주어야 하고, 배열은 한번 만들면 크기를 변경할 수 없어서  크기가 모자르면 새로운 배열을 만들고 관리해줘야 한다는 단점이 있는데, 

Vector클래스는 이러한 것을 모두 자동으로 해준다.

우리는 그냥 add라는 메서드로 add(new Tv());이런식으로 추가만 해주면된다.

이 Vector클래스는 11장에서 자세히 다룰 것이다. 

지금은 "Object배열에는 모든 종류의 객체를 저장할 수 있다" 라는 것 정도만 이해하면 된다.

 

[Ex7_9]

class Product2 {
    int price;          // 제품의 가격
    int bonusPoint;     // 제품구매 시 제공하는 보너스점수

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

    Product2() {}       // 기본 생성자
}

class Tv2 extends Product2 {
    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;              // Product배열에 사용될 카운터

    void buy(Product2 p) {
        if(money < p.price) {
            System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
            return;
        }
        money = money - p.price;                        // 가진 돈에서 구입한 제품의 가격을 뺀다.
        bonusPoint = bonusPoint + p.bonusPoint;         // 제품의 보너스 점수를 추가한다.
        cart[i] = p;                                  // 제품을 Product[] cart에 저장한다.
        i = i + 1;
        System.out.println(p + "을/를 구입하셨습니다.");
    }
//  뒷페이지에 계속
    void summary() {                // 구매한 물품에 대한 정보를 요약해서 보여준다.
        int sum = 0;                // 구입한 물품의 가격 합계
        String itemList = "";       // 구입한 물품목록

        // 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
        for (int i = 0; i < cart.length; i = i + 1) {
            if(cart[i]==null) break;
            sum = sum + cart[i].price;
            itemList = itemList + cart[i] + ", ";
        }
        System.out.println("구입하신 물품의 총 금액은" + sum + "만원입니다.");
        System.out.println("구입하신 제품은" + itemList + "입니다.");
   }
}

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();
    }
}

 

[실행 결과]

Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
Audio을/를 구입하셨습니다.
구입하신 물품의 총 금액은350만원입니다.
구입하신 제품은Tv, Computer, Audio, 입니다.
반응형

'JAVA' 카테고리의 다른 글

추상 클래스의 작성 (1)  (0) 2022.04.05
추상 클래스, 추상 메서드  (0) 2022.04.05
매개변수 다형성  (0) 2022.04.04
instanceof 연산자  (0) 2022.04.03
참조변수의 형변환  (0) 2022.04.03