JAVA2_day06 | 다형성 연습문제
# 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] == null) break; 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의 주석과 같이 객체를 완전히 인스턴스화 하는 것이 아니라 일회성으로 생성해준다.