minOS

자바의 정석 ch7-29,30 여러 종류의 객체를 배열로 다루기 본문

TIL/남궁성의 자바의 정석

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

minOE 2023. 12. 28. 04:36
728x90

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

다형성의 장점

1) 다형적 매개변수 사용 가능

2)하나의 배열에 여러 종류 객체 저장

하나의 배열에 여러 종류 객체 저장
- 조상 타입의 배열에 자손들의 객체를 담을 수 있다.

1) 배열을 사용하지 않았을 때
class Product{
    int price;   //제품가격
    int bonusPoint; //보너스 점수

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

class Tv extends  Product {
    Tv() {
        super(100);
    }
}
class Computer extends  Product{
    Computer() {
        super(200);
    }
}

class Audio extends  Product{
    Audio(){
        super(50);
    }
}


public class Main {
    public static void main(String[] args) {
        Product p1 = new Tv();
        Product p2 = new Computer();
        Product p3 = new Audio();
    }
}​

 

그림

2) 배열을 사용했을 때

class Product{
    int price;   //제품가격
    int bonusPoint; //보너스 점수

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

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 Audio extends Product {
    Audio(){
        super(50);
    }
    public String toString() {
        return "Audio";}
}


public class Main {
    public static void main(String[] args) {

        Product [] p  = new Product[3];
        p[0] = new Tv();
        p[1] = new Computer();
        p[2] = new Audio();

        System.out.printf("%s, %s, %s",p[0],p[1],p[2]);

    }
}
그림
출력



 

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

package ch7_30;

class Product{
    int price;   //제품가격
    int bonusPoint; //보너스 점수

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

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 Audio extends Product {
    Audio(){
        super(50);
    }
    public String toString() {
        return "Audio";}
}

class Buyer {
    int money = 1000;
    int bonusPoint = 0;
    Product[] cart = new Product[10]; // 구입한 제품을 저장하기 위한 배열
    int i =0;  // cart 배열의 인덱스
    void buy(Product p) {
            if (money < p.price) {
                System.out.println("잔액 부족");
                return;
            }
            money -= p.price;
            bonusPoint += p.bonusPoint;
            cart[i++] = p;  // 제품을 Product [] cart 에 저장 , 선언된 cart 배열의 객체의 숫자보다 cart 배열 길이가 작을 경우 ArrayIndexOutOfBoundsException 발생
            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;  // 구입한 물건 합계
            if (cart[i+1] == null)  // 구입한 물건 종류 , 편의를 위해 이렇게 코드 짠 거지 배열 길이가 할당된 객체 수와 같으면 ArrayIndexOutOfBoundsException 발생
                itemList += cart[i];
            else
                itemList += cart[i] + ",";

        }
        System.out.println("총 소비 금액은" + sum + "입니다");
        System.out.println("구매한 물품은" + itemList + "입니다");
    }
}


public class Main{
    public static void main(String[] args) {
       Buyer b = new Buyer();
       b.buy(new Computer());
       b.buy(new Tv());
       b.buy(new Audio());
       b.summary();
    }
}


출력

 
ArrayIndexOutOfBoundsException 발생 방지 코드

package ch7_30;

class Product{
    int price;   //제품가격
    int bonusPoint; //보너스 점수

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

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 Audio extends Product {
    Audio(){
        super(50);
    }
    public String toString() {
        return "Audio";}
}

class Buyer {
    int money = 1000;
    int bonusPoint = 0;
    Product[] cart = new Product[2]; // 구입한 제품을 저장하기 위한 배열
    int index =0;  // cart 배열의 인덱스
    int buy(Product p) {
        if (money < p.price) {
            System.out.println("잔액 부족");
            return 0;
        }

        money -= p.price;
        bonusPoint += p.bonusPoint;
        if(cart.length <= index) //ArrayIndexOutOfBoundsExceptions나는 경우 해결
            return 0;

        cart[index++] = p;  // 제품을 Product [] cart 에 저장

        System.out.println(p + "을/를 구입하였습니다");
        return index;
    }


    void summary() {
        int sum = 0;
        String itemList = "";
        for (int i = 0; i < cart.length; i++) {
            if (cart[i] == null)
                break;
            sum += cart[i].price;  // 구입한 물건 합계
            if (i == index-1)  // 구입한 물건 종류 ,ArrayIndexOutOfBoundsExceptions나는 경우 해결
                itemList += cart[i];
            else
                itemList += cart[i] + ",";

        }
        System.out.println("총 소비 금액은" + sum + "입니다");
        System.out.println("구매한 물품은" + itemList + "입니다");
    }
}


public class Main{
    public static void main(String[] args) {
        Buyer b = new Buyer();
        b.buy(new Computer());
        b.buy(new Tv());
        b.buy(new Audio());
        b.summary();
    }
}


출력

 

728x90