전제조건: 상속의 관계에 있어어야 함
Up casting (업캐스팅)
- 부모 타입의 객체에 자식 클래스의 필드를 담아주는 것
- 부모 타입의 객체에 자식 생성자를 호출
- 필드의 사용 범위가 부모타입만큼 제한 되기 때문에 자식 클래스에서 추가된 내용은 사용할 수 없다. 단, 오버라이딩 된 메소드는 사용가능
- 자식필드는 존재하지만, 사용불가능인 개념
부모클래스 객체명 = new 자식생성자();
Car mycar = new SuperCar();
Down casting (다운캐스팅)
- 업 캐스팅 된 객체를 다시 자식타입으로 바꾸는 기법
- 업캐스팅이 되지 않은 객체는 다운캐스팅 불가능
- 업 캐스팅 된 객체에 다시 자식클래스의 필드를 달아주는 것
- 업 캐스팅시 잘려나갔던 자식 클래스의 내용들을 다시 사용할 수 있게 하려면 자식 클래스의 타입으로 바꿔주어야한다.
(자식클래스)업캐스팅된 객체
자식 클래스 객체 = (자식클래스)업캐스팅된 객체;
객체.자식필드
Ex) 객체배열에서의 업캐스팅과 다운캐스팅
Car[] garage = {
new Car("Avante", "Gray", 2000),
new SuperCar("Porche", "mint", 20000,"abc"), //업캐스팅: 부모타입(Car)의 객체에 자식 타입(Super)의 객체를 넣었음
new Car("Genesis", "Gray", 10000)
}
//garage[2] 는 업캐스팅 됬으므로, SuperCar의 메소드를 사용할 수 없다.
// garage[2].roofOpen(); 불가능
// (SuperCar)garage[2].roofOpen(); 다운캐스팅 실패 (하위 연산자`.` 가 형변환 연산자보다 먼저 실행되기 때문에, 다운캐스팅이 뒤늦게 실행되어 불가능)
((SuperCar)garage[2]).roofOpen(); //다운캐스팅
SuperCar downObj = ((SuperCar)garage[2]); //보통 다운캐스팅은 자식타입의 객체에 담아놓고 사용한다.
downObj.roofClose();
<업캐스팅 다운캐스팅 확인하는 비교>
instanceof
객체 instanceof 클래스명
: 객체 뒤에 오는 클래스의 타입인지 확인 (true, false)
부모객체 instanceof 부모클래스 //true
자식객체 instanceof 자식클래스 //true
부모객체 instanceof 자식클래스 //false
자식객체 instanceof 부모클래스 //true
//////////////////////////////////////
업캐스팅객체 instanceof 부모클래스 //true
업캐스팅객체 instanceof 자식클래스 //true
Ex) 조건부 다운캐스팅
for(int i = 0; i < garage.length; i++) {
/*garage[i]은 Car 타입이거나 SuperCar 타입이 업캐스팅 된 채 담겨있을 것이다.
* 따라서 하나씩 꺼내와서 비교할 때, Car 타입은 비교하면 false가 나올 것이고, 업캐스팅된 객체를 비교하면 true 가 나올것이다.
*/
if(garage[i] instanceof SuperCar) {
SuperCar Obj = (SuperCar) garage[i];
Obj.roofOpen();
}
'Java > Java(base)' 카테고리의 다른 글
[Java] 추상클래스 abstract class, final (0) | 2021.12.01 |
---|---|
[Java]접근 권한 제어자 public, private, protected, default / getter, setter (0) | 2021.11.30 |
[Java] static (정적) : 모든 객체가 공유 (0) | 2021.11.29 |
[Java] 다형성 Polymorphism : Overloading(오버로딩), Overriding(오버라이딩) (0) | 2021.11.29 |
[Java] 상속(inheritance), 자식클래스 생성자, super() (0) | 2021.11.29 |