본문

배열 vs Vector

반응형

물건을 구입, 환불, 총액 계산을 하는 예제이다. 

만일 이 예제의 Product를 배열로 했다면, 배열은 고정크기이므로 사용자(Buyer)가 구매할 수 있는 상품이 제한될 것이다. 

그렇다고 해서 배열의 크기를 무조건 크게 설장할 수 만도 없는 일이다.

이런 경우, Vector클래스를 사용하면 된다. Vector클래스는 내부적으로 Object타입의 동적으로 크기가 관리되는 객체배열이기 때문이다. 

그리고 배열의 크기를 알아서 관리해주기 때문에 저장할 인스턴스의 개수에 신경쓰지 않아도 된다.


Source01) VectorEx.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import java.util.Vector;
 
public class VectorEx {
    public static void main(String[] args) {
        Buyer buyer = new Buyer();
        Tv tv = new Tv();
        Computer computer = new Computer();
        Audio audio = new Audio();
 
        buyer.buy(tv);
        buyer.buy(computer);
        buyer.buy(audio);
        buyer.summary();
        System.out.println();
 
        buyer.refund(computer);
        buyer.summary();
    }
}
 
class Product {
    final static int BONUS_POINT = 10;
    
    int price; // 제품의 가격
    int bonusPoint; // 제품구매 시 제공하는 보너스의 점수
 
    Product(int price) {
        this.price = price;
        bonusPoint = (int) (price / BONUS_POINT);
    }
 
    Product() {
        price = 0;
        bonusPoint = 0;
    }
}
 
class Tv extends Product {
    Tv() {
        super(100); // 조상클래스의 생성자 Product(int price)를 호출한다.
                 // 즉 Tv의 가격을 100으로 지정
    }
 
    public String toString() {
        return "Tv";
    }
}
 
class Computer extends Product {
    public Computer() {
        super(200); // Computer의 가격을 200으로 지정
    }
 
    public String toString() {
        return "Computer";
    }
}
 
class Audio extends Product {
    public Audio() {
        super(50); // Audio의 가격을 50으로 지정
    }
 
    public String toString() {
        return "Audio";
    }
}
 
// 고객, 물건을 사는 사람
class Buyer {
    int money = 1000// 소유금액
    int bonusPoint = 0// 보너스점수
 
    /*
     * 구입한 제품을 저장하기 위한 배열 배열로 크기를 지정하면 11개 이상의 제품을 구입할 수 없다. 
     * 그렇다고 배열의 크기를 무조건 크게 설정할 수만도 없는 일이다. 따라서 동적배열인 Vector클래스를 사용한다.
     */
    // Product[] item = new Product[10];
 
    // 구입한 제품을 저장하는데 사용될 Vector객체
    Vector item = new Vector();
 
    void buy(Product product) {
        if (money < product.price) {
            System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
            return// 프로그램 종료
        }
 
        // 가진 돈에서 구입한 제품의 가격을 뺀다.
        money -= product.price;
 
        // 제품의 보너스 점수를 추가한다.
        bonusPoint += product.bonusPoint;
 
        // 구입한 제품을 Vector에 저장한다.
        item.add(product);
        System.out.println(product + "을/를 구입하셨습니다.");
    }
 
    // 구입한 제품을 환불한다.
    void refund(Product product) {
        // 구입한 제품을 환불한다.
        if (item.remove(product)) {
            money += product.price;
            bonusPoint -= product.bonusPoint;
            System.out.println(product + "을/를 반품하셨습니다.");
        } else { // 제거에 실패한 경우
            System.out.println("구입하신 제품 중 해당 제품이 없습니다.");
        }
    }
 
    // 구매한 물품에 대한 정보를 요약해서 보여준다.
    void summary() {
        int sum = 0// 구매 총액
        String itemList = "";
 
        // Vector가 비어있는지 확인한다.
        if (item.isEmpty()) {
            System.out.println("구입하신 제품이 없습니다.");
            return// 프로그램 종료
        }
 
        // 반복문을 이용해서 구입한 물품의 총 가격과 목록을 만든다.
        for (int i = 0; i < item.size(); i++) {
            Product product = (Product) item.get(i);
            Product bonusPoint = new Product();
 
            sum += product.price;
            itemList += (i == 0) ? "" + product : ", " + product;
        }
 
        System.out.println("구입하신 물품의 총금액은 " + sum + "만원이며, 누적 포인트는 " + bonusPoint + "점 입니다.");
        System.out.println("구입하신 제품은 " + itemList + " 입니다.");
    }
}
cs

Result)

1
2
3
4
5
6
7
8
9
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
Audio을/를 구입하셨습니다.
구입하신 물품의 총금액은 350만원이며, 누적 포인트는 35점 입니다.
구입하신 제품은 Tv, Computer, Audio 입니다.
 
Computer을/를 반품하셨습니다.
구입하신 물품의 총금액은 150만원이며, 누적 포인트는 15점 입니다.
구입하신 제품은 Tv, Audio 입니다.
cs





참고 : JAVA의정석(남궁성 저)

반응형

공유

댓글