- 공통으로 들어가는 상품가격, 상품명 등은 product 클래스에 넣기
- SmartTv,Notebook,HandPhone -> product에서 상속받기
public class Product extends Object {
//extends Object 생략가능
public int price; //상품가격
public int bonusPoint; //마일리지 (상품을 구매하면 마일리지가 쌓여아함)
public Product() {} //default construct
public Product(int price) {
this.price=price; //this.멤버변수=지역변수
//상품가격의 10%를 보너스 점수 책정
this.bonusPoint=(int)(price*0.1);
}//Product end
}//Product class end
class SmartTV extends Product{
// public int price; → 보이지 않지만 Product를 상속받았기 때문에 Product 안에 있는 값이 살아있다.
// public int bonusPoint;
public SmartTV() {
super(100); // 상품가격 price=100, bonusPount=10
// 부모가 먼저 생성되어야 내가 생성이 되기 때문에 super();로 부모에 값을 먼저 찍어준다.
}
@Override
public String toString() {
return "스마트TV"; //상품명
}
}//class end
class Notebook extends Product{
// public int price; → 보이지 않지만 Product를 상속받았기 때문에 Product 안에 있는 값이 살아있다.
// public int bonusPoint;
public Notebook() {
super(200); // 상품가격 price=200, bonusPount=20
}
@Override
public String toString() {
return "노트북"; //상품명
}
}//class end
class HandPhone extends Product{
// public int price; → 보이지 않지만 Product를 상속받았기 때문에 Product 안에 있는 값이 살아있다.
// public int bonusPoint;
public HandPhone() {
super(150); // 상품가격 price=150, bonusPount=15
}
@Override
public String toString() {
return "핸드폰"; //상품명
}
}//class end
※ 주의! SmartTV로 자료형을 생성하면 Notebook과 HandPhone은 넣을 수 없음.
package oop0919;
// 상품 구매 관련 클래스
public class Buyer {
private int myMoney=1000; // 나의 총 재산
private int myMileage=0; // 나의 마일리지 점수(bonusPoint에 누적시키기)
private int i=0;
//상품을 구매했을 때 어떤 상품을 구매했는지 저장시켜야함. (나의 구매상품 목록)
Product[] item=new Product[10]; // 다형성으로 부모 클래스에 자식클래스를 넣는다.
/*
Product
+------------+-------------+-------------+--
| SmartTV | Notebook | Handphone | ~~
+------------+-------------+-------------+--
item[0] item[1] item[2] ~~
*/
public Buyer() {}
/*
메소드 오버로딩(함수명 중복 정의)
public void buy(SmartTV a) {}//buy() end
public void buy(Notebook a) {}//buy() end
public void buy(HandPhone a) {}//buy() end
*/
public void buy(Product p) { //다형성
//Product → SmartTV, Notebook, HandPhone 클래스의 부모클래스로 넣어준다.
item[i++]=p; //구매상품 저장
this.myMoney=this.myMoney-p.price; //나의 재산은 감소
this.myMileage=this.myMileage+p.bonusPoint;//나의 마일리지는 증가
}//buy() end
public void disp() {
System.out.println("나의 남은 재산 : " + this.myMoney);
System.out.println("나의 마일리지 : " + this.myMileage);
}//disp() end
}// class end
SmartTV tv=new SmartTV();
Notebook note=new Notebook();
HandPhone phone=new HandPhone();
Buyer kim=new Buyer();
kim.buy(tv);
kim.buy(note);
kim.buy(phone);
kim.disp();
💻 console
나의 남은 재산 : 550
나의 마일리지 : 45
kim.buy(tv);
public SmartTV() {
super(100);
// 상품가격 price=100, bonusPount=1
}
public void buy(Product p) { //다형성
//Product → SmartTV, Notebook, HandPhone 클래스의 부모클래스로 넣어준다.
/* 잔액부족 문제풀기 강사님코드 */
if(p.price>this.myMoney) {
System.out.println("잔액이 부족합니다!!");
return;
}//if end
item[i++]=p; //구매상품 저장
this.myMoney=this.myMoney-p.price; //나의 재산은 감소
this.myMileage=this.myMileage+p.bonusPoint;//나의 마일리지는 증가
}//buy() end
if(this.myMoney<=0) {
System.out.println("잔액이 부족합니다.");
return;
}//if end
[오답노트 적기]
- public void disp() {} 클래스 안에 작성
// 구매 상품 목록
StringBuilder shoplist=new StringBuilder();
//사용금액
int hap = 0;
for(int n=0; n<item.length; n++) {
if(item[n]==null) { // 상품이 있을 때만 확인해야하므로 조건을 준다.
break;
}//if end
shoplist.append(item[n].toString() + " "); //상품명
hap=hap+item[n].price;
}//for end
System.out.println("구매 상품 목록 : " + shoplist);
System.out.println("사용금액 : " + hap);
System.out.println("나의 남은 재산 : " + this.myMoney);
System.out.println("나의 마일리지 : " + this.myMileage);
💻 console
구매 상품 목록 : 스마트TV 노트북 핸드폰 핸드폰 핸드폰 핸드폰
사용금액 : 900
String list=""; // 구매 상품 목록
int count = 0; // 상품의 총 합계 금액
for(int i=0; i<item.length; i++) {
list = list + item[i];
// System.out.println(item[i].price);
// count = count + item[i].price;
// ? 금액을 어떻게 가져오지??
}
System.out.println(count);
[⚠️ 오답노트]
append()
: 기존 문자열의 뒤쪽에 문자열을 추가하는 기능, 이어붙이기private Vector<Product> item=new Vector<>();
객체생성을 하면 기존에 buyer 클래스에 있던 item과 변수명이 같아도 Vector 때문에 불일치하다고 에러가 발생한다.
item[i++]=p;
-> item.add(p);
- item.함수로 바꿔야한다.
if(item[n]==null)
-> if(item.isEmpty())
n<item.length;
-> n<item.size();
(추가) Product p =item.get(i);
- 상품 하나씩 가져와서 Product p 변수에 넣기.
//4) 반품하기
//→ Order 클래스
//→ (Buyer클래스 복사해서 수정)
//→ 상품을 중복해서 구매하지 않았다는 전제하에 반품
Order lee=new Order();
lee.buy(tv);
lee.buy(note);
lee.buy(phone);
lee.disp();
System.out.println("<<<<<<<반품");
lee.refund(note);
System.out.println("<<<<<<<결과");
lee.disp();
public void refund(Product p) {
if(item.remove(p)) {
System.out.println(p.toString() + "반품되었습니다.");
this.myMoney =this.myMoney+p.price;
this.myMileage=this.myMileage-p.bonusPoint;
}else {
System.out.println("구매 내역에 상품이 없습니다!");
}//else end
}//refund() end