● 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() 메소드(자식 값)
}
}
![](https://blog.kakaocdn.net/dn/MPcrc/btruXUxqoaq/9anbaKThx4NhrNQ9wcZEa1/img.png)
※ 오류 발생
- 자식에서 추가로 만든 필드는 사용할 수 없다.
noOptionFerrari.openRoof();
2. down casting
public class CastingTest {
public static void main(String[] args) {
SuperCar fullOptionFerrari = (SuperCar)noOptionFerrari; // 자식 타입
fullOptionFerrari.openRoof();
}
}
![](https://blog.kakaocdn.net/dn/eBggjv/btruZQafubr/k2dG9tkHetAu68TUXwiel1/img.png)
※ 오류 발생
- 자식에 부모 값을 담을 수 없다.
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]);
}
}
![](https://blog.kakaocdn.net/dn/btWQri/btru4joXS1G/8zPunyTfZwcfT2Bha1Rlj0/img.png)
'웹 개발 > 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 |