Published 2022. 11. 3. 16:45

 * 다형성의 정의

 - 상속구조에서 부모타입으로부터 파생된 여러타입의 자식 객체들을 부모타입 하나로 다룰 수 있는 기술 


    
 * 다형성을 쓰는 목적(장점)

 - 코드 길이 감소   

- 클래스 형변환

업 캐스팅(Up Casting)  : 부모 타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있음 

                                       (자식타입 --> 부모타입 으로 자동 형변환)

다운캐스팅 (Down Casting) :  자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야할 경우 ,

                                         부모 클래스 타입의 참조형 변수를 자식 클래스 타입으로 형변환 하는 것 

                                       (부모타입 --> 자식타입으로 강제 형변환)

 

* 다형성을 사용하는 이유 


 * 1. 부모타입의 배열로 다양한 자식객체들을 받을 수 있음
 * 2. 메소드 정의시 다형성 개념을 적용시키면 메소드 갯수가 확 줄어들수있음 
 *  => Object클래스의 equals 메소드의 매개변수가 Object타입으로 되어있음 

 *  학생객체.equals(학생객체)
 *  도서객체.equals(도서객체)
 *  제품객체.equals(제품객체)

예시 1)

 // 다형성 적용 전
	 // Child1 객체 2개와 Child2객체 2개를 관리
	 Child1[] arr1 = new Child1[2];
	 arr1[0]= new Child1(1,2,4);
	 arr1[1]= new Child1(3,4,5);
	 
	 Child2[] arr2 = new Child2[2];
	 arr2[0] = new Child2(2,3,4);
	 arr2[1] = new Child2(1,4,5);
     
      // 다형성 적용 후 
	 Parent[] arr = new Parent[4];
	//Parent
	 arr[0] = new Child1(1,2,4);
	 arr[1] = new Child2(2,3,4);
	 arr[2] = new Child2(1,4,5);
	 arr[3] = new Child1(3,4,5);
	 
	 System.out.println("======================");
	 ((Child1)arr[0]).printChild1();
	 ((Child2)arr[1]).printChild2();
	 //((Child1)arr[2]).printChild1();   //ClassCastException 실직적으로 담긴 객체의 자료형과 달라 오류 (부적절한 클래스 형변환시)
	 ((Child2)arr[2]).printChild2();
	 ((Child1)arr[3]).printChild1();
	 
	 System.out.println("=======반복문 이용========");
	     /* // 강제형변환 사용시
	     for(int i=0;i<arr.length;i++) {
		 if(i==0 || i==3) {
		 ((Child1)arr[i]).printChild1();
		 } else{
			 ((Child2)arr[i]).printChild2();
		 }
		*/ 
		 
		 /*
		  * instanceof => 현재 레퍼런스가 실직적으로 어떤 클래스 타입을 참조하는지 확인할 때 사용
		  */
	 
	     for(int i =0; i<arr.length;i++) {
	    	 if(arr[i] instanceof Child1){ // arr[i]레퍼런스가 실제 Child1참조하고 있을경우 true
	    		 ((Child1)arr[i]).printChild1();
	    	 }else {
	    		 ((Child2)arr[i]).printChild2();
	    	 }
	     }


예시 2)

//다형성 적용 전 case
public class ElectronicShop1 { 
	//전자상가에 있는 가게라고 생각
	
	private Desktop desk;
	private NoteBook note;
	private Tablet tab;
	//자식타입의 매개변수 
	public void insert(Desktop d) { //Desktop d = new Desktop(~~);
		desk = d; 
	}
	public void insert(NoteBook n) {
		note = n;
	}
	public void insert(Tablet t) {
		tab = t;
	}
	
	public Desktop selectDesktop() {
		return desk;
	}
	public NoteBook selectNoteBook() {
		return note;
	}
	public Tablet selecTablet() {
		return tab;
	}
    //실행클래스 
    public static void main(String[] args) {
		//1. 다형성 적용 안했을 경우 (ElectronicShop1)
		
		ElectronicShop1 es = new ElectronicShop1();
		
		//추가기능
		es.insert(new Desktop("Samsung","데탑",1200000,"Geforce1070"));
		es.insert(new NoteBook("LG","그램",2000000,4));
		es.insert(new Tablet("Apple","아이패드",800000,false));
		
		//조회
		Desktop d = es.selectDesktop();
		System.out.println(d);
		
		NoteBook n = es.selectNoteBook();
		System.out.println(n);
		
		//Tablet t = es.selecTablet();
		System.out.println(es.selecTablet());
//다형성 적용 후 
public class ElectronicShop2 { 
	
	private Electronic[] elec = new Electronic[3];
	private int count = 0;
	
	public void insert(Electronic any) { //부모타입의 매개변수 하나 작성시 자식클래스 객체 모두 받아줄수있음 
		elec[count++] = any;
		//count++;
	}
	
	public Electronic select(int index) {
		return elec[index];
		
        
  public class ElectronicRun { 
   // 실행용 클래스는 납품업체라고 생각 
	public static void main(String[] args) {      
    System.out.println("=============다형성 적용=============");
		//2. 다형성 적용했을 경우 (ElectronicShop2)
		
		ElectronicShop2 es2 = new ElectronicShop2();
		
		//추가 
		es2.insert(new Desktop("Samsung","데탑",1200000,"Geforce1070"));
		es2.insert(new NoteBook("LG","그램",2000000,4));
		es2.insert(new Tablet("Apple","아이패드",800000,false));
		
		//조회
		Desktop d2 = (Desktop)es2.select(0);
		NoteBook n2 = (NoteBook)es2.select(1);
		Tablet t = (Tablet)es2.select(2);
		
		System.out.println(d2);
		System.out.println(n2);
		System.out.println(t);

'JAVA' 카테고리의 다른 글

9_3. 다형성 _ 인터페이스  (0) 2022.11.03
9_2 . 다형성 _ 추상클래스/ 추상메소드  (0) 2022.11.03
8_2. 상속 오버라이딩  (0) 2022.11.02
8. 상속  (0) 2022.11.02
7. 객체 배열  (0) 2022.10.31
복사했습니다!