JAVA Programming

Growing_HJ·2024년 5월 28일

일기장

목록 보기
5/51

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);
	}
}

0개의 댓글