본문 바로가기
JAVA

JAVA_다형성

by haheaven 2021. 8. 1.

* '상속'에 대한 이해를 바탕으로 학습이뤄져야 함

 

- 다형성 (Polymorphism)

: 조상타입의 참조변수로 자손타입의 객체(자손의 인스턴스)를 가리키는 것 

  ( 자손타입의 참조변수로 조상 타입객체 가리킴 --> X)

- 장점,

① 다형적 매개변수 (조상의 참조변수로 자손타입객체 가리킬 수 있으며, 참조변수의 형변환으로 사용가능한 멤버변수 수 조절가능)

② 하나의 배열로 여러 종류 객체 다룰 수 있다. 

public class Polymorphism1 {
 public static void main(String[] args) {
   Notebook n = null;
   Mac m = new Mac();
   Mac m2 =null;
    System.out.println(m.color);  //null
    m.OS();                      //"iOS"
        	 
   n = (Notebook)m;   //(=> n = m;) 자손타입 m이 조상타입 n으로 형변환할 때는 생략가능!
   m2 = (Mac)n;      //조상타입 n이 자손타입의 m2로 가기 때문에 형변환 꼭 명시!
    System.out.println(m2.model); //"APPLE"
    m2.OS();                      //"iOS"
        	 
    Gram g = null;
  //g = (Gram)m; //자손끼리 형변환 불가능   
	}
}
  class Notebook {
    String color;
    boolean power = false;
    void power() {
	   power = !power;
    }
}
  class Mac extends Notebook{
   String model ="APPLE";
 
   void OS() {
    System.out.println("iOS");
    }
  }
  class Gram extends Notebook {
   String model = "LG";
   
   void OS () { 
    System.out.println("Window");
  }
 }

그림으로 살펴보면, 

 

 

- 참조변수와 인스턴스의 연결 

:메서드의 경우 조상클래스의 메서드를 자손클래스의 메서드와 일치할 경우 오버라이딩 해서 호출되지만, 멤버변수(iv)의 경우 참조변수 타입에 따라 달라진다.

public class Ploymorphism2
public static void main(String[] args) {
  Notebook2 n = new Mac2();
  Mac2 m = new Mac2();
   System.out.println("n.color: " + n.color);  //"n.color : black"
   n.method();  //"Mac"
   System.out.println("m.color: " + m.color);  //"m.color : silver"
   m.method();  //"Mac"
	}
}
 class Notebook2 {
  String color = "black";
  boolean power = false;
 
 void method() {
  System.out.println("Notebook");
  }
}
 class Mac2 extends Notebook2{
  String color = "silver";    //조상과 멤버변수이름 중복 
  String model ="APPLE";
 
  void method() {            //조상과 메소드이름 중복 
    System.out.println("Mac");
    }
 }

그림으로 살펴보면,

 

 

 

 

- 매개변수의 다형성 예제 코드 (자바의정석 예제 ex7_21 참고)

 : 조상 참조형 매개변수는 메서드 호출시. 자신과 같은타입, 자손타입의 인스턴스를 넘겨줄 수 있다.

public class Polymorphism3 {
  public static void main(String[] args) {
	Buyer b = new Buyer();
		
	b.buy(new Computer());   // Product p = new Computer() 
	b.buy(new Tv());         // Product p = new Tv()
		
	System.out.println("현재 남은 돈 : " + b.money);
	System.out.println("현재 적립 보너스 : " + b.bonus);
	}
}
   class Product {
    int price;
    int bonus;
    	 
    Product(int price) {
      this.price = price;
      bonus = (int)(price/10.0);
     }
   }
  class Tv extends Product{
      Tv(){
    	super(100);    //tv가격 100만원 
    }
     public String toString() { return "Tv"; }  //Object의 toString() 오버라이딩 
    }
  class Computer extends Product{
    Computer(){
    	super(200);  //Computer가격 200만원 
    	}
    	public String toString() { return "Computer"; }
    }
  
  class Buyer {
   int money = 1000;  //소비자가 가진 돈 1000만원 
   int bonus = 0;
    	
    void buy(Product p ) {
     if (money < p.price) {
    	System.out.println("잔액부족");
    	 return;
    		}
      money = money - p.price;
      bonus = bonus + p.bonus;
      System.out.println(p +"을 구매함");
    	}
    }

 

 

 

 

 

- 배열에 여러 종류 객체 저장 예제(자바의 정석 예제 Ex7_22 참고)

public class Ex7_23_Polymorphism4 {
 public static void main(String[] args) {
    Buyer2 b = new Buyer2();
    
   b.buy(new Tv2());  
   b.buy(new Computer2());
   b.buy(new Audio2());
   b.summary();
	}
}      
 class Product2 {
  int price;
  int bonus;	 
   Product2(int price) {
	 this.price = price;
     bonus = (int)(price/10.0);
 }
    Product2 (){
	 }
}

 class Tv2 extends Product2{
   Tv2(){ 
    super(100);
	}
	public String toString() { return "Tv2"; }
}
 class Computer2 extends Product2{
   Computer2(){
	 super(200);
	}
     public String toString() { return "Computer2"; }
}
 class Audio2 extends Product2{
	Audio2(){
		super(50);
		}
	public String toString() { return "Audio2"; }
}

 class Buyer2 {
   int money = 1000;
   int bonus = 0;
   Product2 [] item = new Product2[10];
   int i =0;
   
   void buy(Product2 p) {
	if(money < p.price) {
	  System.out.println("잔액부족함");
		return;
	  }
	money -= p.price;
	bonus += bonus;
    item[i++] = p;
	 System.out.println(p.toString()+ "를 구입함");
	}
    void summary() {
     int sum = 0;
     String itemList = " ";
   
    //구매 총구입, 구입한 물건 출력 
    for(int i = 0; i<item.length; i++) {
     if(item[i]==null) break;	
     sum += item[i].price;
     itemList += item[i].toString() + ",";
    	}
    System.out.println("구입한 총 금액은 " + sum+ "만원");
    System.out.println("구입한 제품은" + itemList);
    }
}

그림으로 살펴보면, 조상타입 Product2 [] item = new Product2[10]; 배열에

  조상을 가진 ,Tv2(), Computer2(), Audio2() 객체를 넣어 하나의 배열로 다룰 수 있다.

 

 

 

 

 

 

 

 

 

 

참고 : 자바의정석(남궁성)

'JAVA' 카테고리의 다른 글

JAVA_인터페이스  (0) 2021.08.02
JAVA_추상화  (0) 2021.08.01
JAVA_제어자  (0) 2021.07.31
JAVA_Pakage와 import  (0) 2021.07.31
JAVA_생성자(Constructor)  (0) 2021.07.31

댓글