초급 JAVA

Java 13일차 객체지향의 다형성

햄찌개 2020. 8. 28. 16:18

13. 다형성 (Polymorphism)
          - 많은 형태를 가질수 있는 성질
          - 부모타입의 참조변수로 자식타입의 참조변수를 참조할 수 있다.

14. 참조변수의 형 변환 
          - 상속관계에서만 가능하다.
          - 자식타입 -> 부모타입 : up-casting, 캐스팅 연산자 생략 가능
          - 부모타입 -> 자식타입 : down-casting, 캐스팅 연산자 생략 불가능 
          - 업케스팅 후 다운케스팅은 가능 
          - 업케스팅 없이 바로다운케스팅은 안됨

15. instanceof 연산자
          - 참조변수가 참조하고 있는 인스턴스의 실제타입을 알아보기 위해 사용한다.
          - 연산결과가 true이면 검사한 타입으로 형변환이 가능하다.
          - 클래스 멤버는 참조변수의 타입에 영향을 받는다.
          - 참조변수의 타입에 영향을 받지 않는 것은 인스턴스 메서드 뿐이다.

16. 매개변수의 다형성
          - 참조변수의 다형적인 특징은 매개변수에도 적용된다.

17. 여러개체배열, Vector
          - 배열은 한번 크기를 정하면 변경할 수 없다. 이를 해결하기 위해 만들어졌다.
          - Vector 동적으로 크기가 관리되는 객체배열이다.
                    : Vector()     -> 10개의 객체를 저장할 수 있는 Vector 객체를 만든다.
                    : add()        -> Vector에 객체를 추가한다.
                    : remove()    -> Vector에서 객체를 삭제한다.
                    : isEmpty()   -> Vector이 비어있는지 확인한다.
                    : get(int index) -> index 번째 객체를 가져온다.
                    : size()  -> 저장된 객체의 수를 반환한다.

 

 

import java.util.Vector;

public class ProductTest {

   public static void main(String[] args) {
      System.out.println("┌─────────────────────────────────┐");
      System.out.println("│                                 │");
      System.out.println("│         Jeon's Market           │");
      System.out.println("│                                 │");
      System.out.println("└─────────────────────────────────┘\n\n");
      NoteBook n = new NoteBook("mac", 300);
      Styler s = new Styler("LG", 200);
      Fridge f = new Fridge("SamSung", 500);
      

      Buyer b = new Buyer("이순신", 10000);
      Buyer c = new Buyer("홍길동", 20000);
      b.buy(f);
      b.buy(n);
      b.buy(n);
      b.summary();
      b.refund(f);
      System.out.println("\n\n\n\n\n\n");
      c.buy(f);
      c.buy(s);
      c.summary();
      c.refund(s);
   }
}

class Product {
   // 제품이름
   String name;
   // 가격
   int price;
   // 보너스 포인트
   int p_point;
   
   Prodnum pd = new Prodnum();
   Product(String name, int price) {
      this.name = name;
      this.price = price;
      p_point = price / 10;
      
      pd.setProdPluse(name);
      }
}

class NoteBook extends Product {

   NoteBook(String name, int price) {
      super(name, price);
   }

   @Override
   public String toString() {
      return "NoteBook";
   }
}

class Styler extends Product {

   Styler(String name, int price) {
      super(name, price);
   }

   @Override
   public String toString() {
      return "Styler";
   }
}

class Fridge extends Product {

   Fridge(String name, int price) {
      super(name, price);

   }

   @Override
   public String toString() {
      return "Fridge";
   }

}

class Buyer {
   String name;
   int money;
   int mileage;
   User u = new User();
   
   
   Vector item = new Vector(); // 10개를 담을 수 있는 배열 생성된것
   Prodnum pd = new Prodnum();
   Buyer(String name, int money) {
      this.name = name;
      this.money = money;
      u.setUser(name);
   }
   
   void buy(Product nb) {
      if (money < nb.price) {
         System.out.println("거지련");
         return;
      }
      pd.setProdbuy(nb.name);
      money -= nb.price;
      mileage += nb.p_point;
      item.add(nb);
      String uName = u.getUser();
      System.out.println(uName + "고객님  " + nb.name + " " + nb
            + "를 구매해주셔서 감사합니다." );
      int NoteBookNum = pd.noteBook_num;
      int fridgeNum = pd.fridge_num;
      int stylerNum = pd.styler_num;
      System.out.println("노트북 제고량 : "+NoteBookNum);
      System.out.println("냉장고 제고량 : "+fridgeNum);
      System.out.println("스타일러 제고량 : "+stylerNum);
      
   }

   // 1.summary
   /*
    * 영 수 증 구매목록 NoteBook 300만원 Styler 200만원 총합 500만원
    * 
    * xxx고객님의 남은돈은 xxx이고 마일리지는 xxx입니다. 오늘도 좋은하루 보내세요.
    */

   void summary() {
      System.out.println("───────────────────────────────────────");
      System.out.println("\t영\t수\t증");
      System.out.println("구매목록");
      int totalPrice = 0;
      for (int i = 0; i < item.size(); i++) {
         if (item.get(i) instanceof Product) {
            Product f = (Product) item.get(i);
            System.out.println("\t" + f.name + "\t\t" + f.price +"만원");
            totalPrice += f.price;
         }
      }
      String uName = u.getUser();
      System.out.println("\n총합\t\t\t" + totalPrice +"만원");
      System.out.println(uName + " 고객님의 남은돈은 " + money + "만원 이고 마일리지는 "
            + mileage + "만원 입니다.");
      System.out.println("오늘도 좋은 하루 보내세요.");
      System.out.println("───────────────────────────────────────");

   }

   // 2. refund (반품)
   /*
    * 1.고려사항 - 물건을 산 내역이 없을때 - 내가 산 물건만 반품
    */
   void refund(Product nb) {
      if (item.isEmpty()) {
         System.out.println("물건을 산 내역이 없습니다.");
		}
		if (item.remove(nb)) {
			money += nb.price;
			mileage -= nb.p_point;
			String uName = u.getUser();
			System.out.println("\n\n반품 영수증 출력");
			System.out.println(uName + " 고객님  " + nb.name + " " + nb
					+ "를 반품하셨습니다");
			summary();
			pd.setProdPluse(nb.name);
			int NoteBookNum = pd.noteBook_num;
			int fridgeNum = pd.fridge_num;
			int stylerNum = pd.styler_num;
			System.out.println("노트북 제고량 : " + NoteBookNum);
			System.out.println("냉장고 제고량 : " + fridgeNum);
			System.out.println("스타일러 제고량 : " + stylerNum);
		} else {
			System.out.println("구매 하신 물건이 아닙니다.");
		}
	}
}

// 3. 물품의 수량을 관리
class Prodnum {
   // 제고
   int noteBook_num=10;
   int styler_num=10;
   int fridge_num=10;

   public int setProdPluse(String name){
      switch(name) {
      case "mac":
         return  noteBook_num++;
      case "LG":
         return  styler_num++;
      case "SamSung":
         return fridge_num++;
      default:
         return 0 ;
      }
   }
   public int setProdbuy(String name){
	   
      switch(name) {
      case "mac":
    	  if(noteBook_num >0){
    		  return  noteBook_num--; 
    	  }else{
    		  System.out.println("노트북의 제고가 없습니다.");
    	  }
    	  	
      case "LG":
    	  if(styler_num>0){
    		  return  styler_num--;
    	  }else{
    		  System.out.println("스타일러의 제고가 없습니다.");
    	  }
      
      case "SamSung":
         if(fridge_num>0){
        	 return fridge_num--;
         }else{
   		  System.out.println("냉장고의 제고가 없습니다.");
   	  }
      default:
         return 0 ;
      }
   }
   
   public int getNoteBook(){
      return noteBook_num; 
   }
   
   public int getStyler(){
      return styler_num;
   }
   
   public int getFridge(){
      return fridge_num;
      
   }

}

// 4. 고객의 목록을 관리해주세요.
// 고객등록 -> 누가 뭐를 몇개 샀는지 누가 뭐를 반품하는지 알아야됨
class User{
    String name;
    
    void setUser(String name){
       this.name = name;       
    }
    String getUser(){
       return name;
    }
}



 

 

오늘도 열심히 .......