JAVA/JAVA2

JAVA2_day06 | 다형성 연습문제

우방이 2018. 1. 17. 23:32

# class Product

1
2
3
4
5
6
7
8
9
10
11
12
13
package productMng;
 
public class Product {
    
    int price;         // 제품가격 
    int bonusPoint;   // 제품 구매시, 제공되는 보너스점수 
    
    public Product() {}
    public Product(int price) {
        this.price = price;
        bonusPoint = (int)(price / 10.0);    // 보너스점수는 제품 가격의 10%
    }
}
cs

# 설명

- Television 클래스와 Computer 클래스의 부모 클래스가 되는 Product 클래스이다. 


Line 5~6: 제품 가격과 보너스점수를 각각 price, bonusPoint 로 선언하였다. 

Line 8: 매개변수가 있는 생성자를 선언하기에 앞서 기본생성자를 반드시 생성해준다.

Line 9~10: 제품 가격을 매개변수로 받아와 본 클래스의 제품 가격에 저장한다. 

Line 11: 매개변수가 있는 생성자를 통해 생성한 객체에서 바로 보너스점수를 계산하여 저장한다.



# class Television

1
2
3
4
5
6
7
8
9
10
11
12
13
package productMng;
 
public class Television extends Product {
    
    public Television() {
        super(100);
    }
    
    @Override
    public String toString() {
        return "Television";
    }
}
cs

# 설명

Line 3: Product 클래스를 상속받는다. (단, 부모 클래스의 생성자는 상속되지 않음을 유의)

Line 5~7: 기본 생성자에서 부모 클래스의 매개변수가 있는 생성자를 호출하여 제품 가격을 매개변수로 넣어준다.

Line 9~12: 슈퍼 클래스인 Object의 toString() 메소드를 클래스의 이름을 반환하도록 오버라이딩한다. 



# class Computer

1
2
3
4
5
6
7
8
9
10
11
12
13
package productMng;
 
public class Computer extends Product {
    
    public Computer() {
        super(200);
    }
    
    @Override
    public String toString() {
        return "Computer";
    }
}
cs



# class Buyer

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
package productMng;
 
public class Buyer {
 
    int money = 1000;    // 소유 금액 
    int bonusPoint = 0;
    
    Product[] item = new Product[10];    // 구매한 물건명 
    int idx = 0;
    
    public Buyer() {}
 
    void buy(Product p) {
        if (money < p.price) {
            System.out.println("잔액이 부족합니다.");
            return;    
        }
        
        money -= p.price;
        bonusPoint = p.bonusPoint;
        
        item[idx++= p;
        System.out.println(p + "을(를) 구입하셨습니다.");
    }
    
    void showInfo() {
        System.out.println("현재 남은 금액은 " + money + "만원 입니다.");
        System.out.println("현재 보너스 점수는 " + bonusPoint + "점 입니다.");
    }
    
    void cart() {
        int sum = 0;
        String itemList = "";
        
        for (int i=0; i<item.length; i++) {
            if (item[i] == nullbreak;
            
            sum += item[i].price;
            itemList += (i==0) ? item[i] : ", " + item[i];
        }
        
        System.out.println("총 금액은 " + sum + "만원 입니다.");
        System.out.println("구입하신 제품은 " + itemList + "입니다.");
    }
}
cs

# 설명

- Television 클래스와 Computer 클래스를 대상으로 제품을 구매하며, 구매한 제품명들과 정보를 출력한다.


Line 8: 구매한 제품명을 저장할 Product 클래스 타입의 배열을 생성한다.

Line 9: Product[] item의 index를 가리키는 변수를 선언과 동시에 초기화를 한다.

Line 13: Television 클래스와 Computer 클래스를 동시에 받을 수 있어야 하기 때문에 이에 대한 부모 클래스 타입인 Product를 매개변수로 받아온다. 

Line 22: item 배열에 p(클래스 이름)을 저장한다. 

Line 31: 구매한 제품명들을 저장하고 출력하는 메소드

Line 33: 구매한 제품명들을 문자열로 저장할 변수의 선언과 초기화 

Line 36: item 배열이 null 값이라면 지금까지 구매한 제품이 없기 때문에 출력할 문자열도 없으므로 break로 for문을 탈출한다.

Line 39: itemList에 삼항연산자를 통하여 제품명들을 저장하게 되는데,

',' 를 통하여 각 제품명들을 구분짓기 위하여 첫번째로 출력할 제품명 앞에는 ','를 붙이지 않고, 그 이후부터 붙이게 한다.


* void buy(Product p): 매개변수를 Product 클래스로 받는 이유는, Television 클래스와 Computer 클래스를 동시에 받을 수 있어야 하기 때문이다.

두 개의 자식 클래스들은 Product 클래스를 상속받기 때문에 접근해야할 price, bonusPoint에 대해 사용가능하다. 



# Main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package productMng;
 
public class Main {
    public static void main(String[] args) {
 
        Buyer b = new Buyer();
        
        // Television t = new Television(); 대신 일회성으로 생성
        b.buy(new Television());
        b.buy(new Computer());
        b.cart();
        b.showInfo();
        
    }
}
 
# 실행 결과
productMng.Television을(를) 구입하셨습니다.
Computer을(를) 구입하셨습니다.
총 금액은 300만원 입니다.
구입하신 제품은 productMng.Television, Computer입니다.
현재 남은 금액은 700만원 입니다.
현재 보너스 점수는 20점 입니다.
cs

# 설명 

Line 6: Buyer 클래스를 인스턴스화 한다. 

Line 9~10: Line 8의 주석과 같이 객체를 완전히 인스턴스화 하는 것이 아니라 일회성으로 생성해준다.