2024.05.24.FRI, <D + 4> , 매개변수의 다형성
import java.util.Vector;
// 매개변수의 다형성
//1. 상품정보에 대한 기반 클래스
class Product {
int price;
int bonusPoint;
Product(int price){
this.price = price;
bonusPoint = (int)(price/10.0);
}
}
// 상품1. 카메라
class Camera extends Product {
Camera(){
super(1000);
}
public String toString() {
return "Camera";
}
}
// 상품2. 컴퓨터
class Computer extends Product {
Computer() {
super(1000);
}
public String toString() {
return "Computer";
}
}
// 구매자 (회원), 다형성을 구현할 클래스
class Buyer{
//클래스 변수
//구매 가능 최대 갯수
final static int MAX_ITEM = 10;
//명시적으로 멤버 변수를 초기화하기.
int money = 3000;
int bonusPoint = 0;
//명시적 멤버변수 초기화
//다형성을 적용한 객체(Product) 배열
Product[] itemList = new Product[10]; // 명시적 초기화
/**+ 구매 제한 취소 -> 자바의 벡터 클래스를 사용, 저장 공간이 자동 증가되는 자료구좋
* 10개의 인스턴스가 저장되는 공간이 만들어짐. 10개 다 사용시 자동증가됨
* 편리한 사용 => add, remove, isEmpty, get, size()**/
Vector item = new Vector();
/**+ 캡슐화 적용 시, 멤버 변수는 위부에서 직접 접근이 불가하다.
* getter, setter 를 통해 접근할 것.
* buy(), summary(): 구매 목록, refund(): 반품을 통해서 멤버 변수에 접근하도록 함. **/
// 비즈니스 로직
int i = 0; //현재 구매한 상품 수, 객체 배열의 위치 정보
void buy(Product p) {
//구매 가능 여부 체크
if(this.money < p.price) {
System.out.println("구매 가능한 금액이 아님");
return ;
}
//구매 갯수 제한
/**i < MAX_ITEM
* 8 < 10 // true: 구매가능
* 10 < 10 // false: 구매불가**/
if(!(i<MAX_ITEM)) { return ; }
//구매 객체 배열 처리
this.money -= p.price;
this.bonusPoint += p.bonusPoint;
//구매한 상품 등록
itemList[i++] = p;
//구매 상품 리스트 (Vector) 등록
item.add(p);
System.out.println("구매가 완료 되었음");
}
// 반품
void refund(Product p) {
if (item.remove(p)) {
// 반품처리
this.money += p.price;
this.bonusPoint -= p.bonusPoint;
System.out.println("반품 처리가 완료됨.");
} else {
System.out.println("삭제 에러, 구매 목록에 없는 상품임");
}
}
void summary() {
int sum = 0;
String itemList = "" ;
/**1. 형변환하기 (유지보수성 고려할 것)
Vector의 상품: Object
Prodect의 상품으로 down casting 해야 함
Object -> Product -> Computer or Camera
형변환이 일어날 때, 멤버변수와 메소드 접근시의 차이점.
멤버변수: 참조 변수의 타입에 맞추어서 따라감.
멤버메소드: 인스턴스의 원래 타입으로 따라감.
총 구매 금액-> Product 형, 구매 목록 전체 -> product 형
**/
// 2. 구매한 제품이 하나라도 있는가
if (item.isEmpty()) {
System.out.println("구매 이력이 없음");
return;
}
for (int i = 0; i < item.size(); i++) {
// Object -> Product 으로 형변환하기
Product p = (Product)item.get(i);
sum += p.price;
//제품 목록
itemList += (i == 0) ? "" + p : ", " + p;
}
System.out.println("총 구매 금액은 " + sum + "임. ");
System.out.println("구매 목록은 " + itemList + "임");
}
}
public class ShoppingEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 상품, 구매자 인스턴스 생성하기
// 구매자가 상품을 구매
Buyer buyer = new Buyer();
// 상품이 다르지만, 동일한 구매 리스트 사용
// buy 매개변수에 상품의 기반 클래스 (Product) 타입으로 선언됨.
buyer.buy(new Camera());
buyer.buy(new Computer());
buyer.buy(new Camera());
System.out.println(buyer.money);
buyer.buy(new Computer());
System.out.println(buyer.money);
}
}