본문 바로가기

웹 개발/Java

[Web_JAVA] 20

● Casting

1. up casting

- 자식 값을 부모 타입으로 형변환

 

2. down casting

- up casting된 객체를 자식 타입으로 형변환

 

※ 부모 값을 자식 타입으로 형변환 시 오류 발생

 

 

 

● Casting을 사용하는 이유

- 모든 자식 값을 전달받기 위해서는 동일한 타입의 저장공간으로 받아야 한다.

- 하지만 자식끼리는 서로 타입이 다르기 때문에 한 번에 전달받을 수가 없다.

- 이 때 up casting을 사용하면, 모든 자식이 부모 타입이므로 하나의 저장공간에 모든 자식을 받을 수 있게 된다.

- 만약 up casting으로 자식 값을 전달받았다면, 자식에서 새롭게 구현한 기능들은 사용할 수 없기 때문에

   down casting을 통해서 복구하여 사용한다.

 

 


 

실습(Casting(1))

※ 부모클래스(Car)와 자식 클래스(SuperCar) 작성

class Car{ 

   public void engineStart() {
      System.out.println("열쇠로 시동 킴");
   }

}


class SuperCar extends Car{
   
   @Override  // 재정의
   public void engineStart() {
      System.out.println("음성으로 시동 킴");
   }
   
   public void openRoof() {
      System.out.println("지붕 열림");
   }

}

 

 

 

1. up casting

public class CastingTest {
   public static void main(String[] args) {

	   Car noOptionFerrari = new SuperCar();  // 부모 타입, 자식 값
	   
	   // 자식에서 재정의된 값은 들어간다.
	   noOptionFerrari.engineStart();  // SuperCar의 engineStart() 메소드(자식 값)
	   
   }
}

 

결과

 

 

※ 오류 발생

- 자식에서 추가로 만든 필드는 사용할 수 없다.

noOptionFerrari.openRoof();

 

 

 

2. down casting

public class CastingTest {
   public static void main(String[] args) {
	   
	   SuperCar fullOptionFerrari = (SuperCar)noOptionFerrari;  // 자식 타입
	   fullOptionFerrari.openRoof();
	   
   }
}

 

결과

 

 

※ 오류 발생

- 자식에 부모 값을 담을 수 없다.

SuperCar brokenFerrari = (SuperCar)new Car();  // Car brokenFerrari = (Car)new SuperCar();는 가능

 

 

 

 

실습(Casting(2))

- 선택한 카테고리의 메소드 실행

1. 애니메이션, 영화, 드라마 클래스를 선언하여 각각의 메소드를 생성한다.

※ 부모 클래스(Video.java) 생성

package casting;

public class Video {

}

 

 

- 애니메이션(Animation.java)

package casting;

public class Animation extends Video{  // 부모 : Video, 자식 : Animation

	public void animate() {
		System.out.println("자막 지원");
	}
	 
}

 

 

- 영화(Film.java)

package casting;

public class Film extends Video{  // 부모 : Video, 자식 : Film
	
	public void playFilm() {
		System.out.println("4D");
	} 
	
}

 

 

- 드라마(Drama.java)

package casting;

public class Drama extends Video{  // 부모 : Video, 자식 : Drama

	public void sellGoods() {
		System.out.println("굿즈");
	}
	
}

 

 

- Animation 클래스를 상속받는 Zzangu 클래스

package casting;

public class Zzangu extends Animation{  // 부모 : Video, 자식 : Zzangu

}

 

 

 

2. 사용자가 선택한 영상를 전달받은 뒤 각 카테고리 별 구현된 기능을 사용하는 메소드를 선언한 후 main 메소드에서 실행한다.

- 메소드 선언

public static void check(Video video) {
	
	// 외부에서 들어온 자식 타입이 Animation이라면
	if(video instanceof Animation) {
		
		// Animation 타입으로 down casting 해준다.
		Animation ani = (Animation)video;
		
		// down casting된 객체로 새롭게 추가된 필드를 사용할 수 있다.
		ani.animate();
		
	} else if(video instanceof Film) {
		Film f = (Film)video;
		f.playFilm();
	} else if(video instanceof Drama) {
		Drama d = (Drama)video;
		d.sellGoods();
	} else {
		System.out.println("없는 영상입니다.");
	}
 
}

 

 

- main 메소드에서 실행

public static void main(String[] args) {
	
	Video[] arVideo = { 
			new Animation(),
			new Film(),
			new Drama(),
			new Zzangu()
	};

	for (int i = 0; i < arVideo.length; i++) {
		CastingTask.check(arVideo[i]);
		
	}
	
}

 

결과

 

 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 22  (0) 2022.03.08
[Web_JAVA] 21  (0) 2022.03.07
[Web_JAVA] 19  (0) 2022.03.05
[Web_JAVA] 18  (0) 2022.03.04
[Web_JAVA] 17  (0) 2022.03.03