자바의 정석 - 여러 종류의 객체를 배열로 다루기

Yohan·2024년 1월 23일
0

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

  • 조상타입의 배열에 자손들의 객체를 담을 수 있다.
Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();

Product p[] = new Product[3]; // 조상 타입 배열 p[]
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();

다형성의 장점

  1. 다형적 매개변수
  2. 하나의 배열에 여러 종류의 객체 저장 가능 (원래 배열은 같은 타입만 저장이 가능한데 다형성을 이용하여 여러 종류의 객체 저장이 가능!)

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

    Product2 (int price) {
        this.price = price;
        bonusPoint = (int) (price / 10.0); // 보너스점수는 제품 가격의 10%
    }
}


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

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


class Computer2 extends Product2 {
    Computer2() {
        super(200); }

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

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;  // 제품을 Product[] cart에 저장
        System.out.println(p + "을/를 구입하셨습니다.");
    }

    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] + ", ";
        }

        System.out.println("구입하신 물품의 총금액은" + sum + "만원입니다. ");
        System.out.println("구입하신 제품의" + itemList + "입니다.");
    }
}

class Ex {
    public static void main(String[] args) {
        Buyer2 b = new Buyer2();

        b.buy(new Tv2());
        b.buy(new Computer2());
        b.summary();

        System.out.println("현재 남은 돈은" + b.money + "만원입니다.");
        System.out.println("현재 보너스점수는" + b.bonusPoint + "점입니다.");
    }
}
profile
백엔드 개발자

0개의 댓글