[20220919] Test01_buyer

kangsun·2022년 9월 19일
0

Java

목록 보기
15/44

상품 구매 및 반품 프로그램

1. 상품만들기

  • 클래스 생성하기 (업무분석)
    → Product 클래스
    → SmartTv 클래스
    → Notebook 클래스
    → HandPhone 클래스

- 공통으로 들어가는 상품가격, 상품명 등은 product 클래스에 넣기
- SmartTv,Notebook,HandPhone -> product에서 상속받기


1) 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


2) 족보 만들기 (위에 있는 Product 클래스 상속받는 자식들)

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

3) 상품 구매 관련 클래스 생성하기


※ 주의! SmartTV로 자료형을 생성하면 Notebook과 HandPhone은 넣을 수 없음.

  • SmartTv, Notebook, HandPhone 을 모두 담을 수 있는 배열의 자료형은 무엇으로 해야할까?
    → Product형으로 담는다.
    → SmartTv, Notebook, HandPhone의 공통점은 부모가 같다.
    → SmartTv, Notebook, HandPhone 자식 클래스는 Product부모 클래스에 들어갈 수 있다! (다형성)

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

2. 상품 진열하기

		SmartTV tv=new SmartTV();
		Notebook note=new Notebook();
		HandPhone phone=new HandPhone();

3. 상품 구매하기

		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	
    	}

조건 사항 추가

  • 나의 남은 재산이 0이하로 -마이너스가 될 땐 구매할 수 없도록 막아줘야한다.

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

  • 잔액부족 출력하기 코드 (mycode)
	if(this.myMoney<=0) {
		System.out.println("잔액이 부족합니다.");
		return;
	}//if end

[오답노트 적기]



2) 구매 상품 목록과 구매한 상품의 총 합계금액 구하기

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

[⚠️ 오답노트]

  • ? StringBuilder shoplist=new StringBuilder();
    - 구매상품 목록을 가져오는 건가?
  • ? shoplist.append(item[n].toString() + " ");
    - shoplist.append 함수 무슨 용도?
    append() : 기존 문자열의 뒤쪽에 문자열을 추가하는 기능, 이어붙이기

3) 반품처리하기

  • Buyer클래스 복사해서 Order 클래스 새파일로 생성

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 변수에 넣기.

드디어 반품하기..( remove() )

		//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();
  • 반품을 하면 사용금액에 -p.price 되어야하고, 마일리지는 +p.bonusPoint 증가해야한다.
	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
profile
코딩 공부 💻

0개의 댓글