자바의 정석 CH7-24,25
* 참조변수의 형변환
- 사용할 수 있는 멤버의 갯수를 조절하는 것
- 조상 자손 관계의 참조변수는 서로 형변환 가능
class Car{}
class FireEngine extends Car {}
class Ambulance extends Car {}
- Car를 부모로 하는 FireEngine과 Ambulance는 각자 Car와 형변환이 가능하지만, 형제끼리(FireEngine, Ambulance)의 형변환은 불가능하다.
FireEngine f = new FireEngine();
Car c = (Car)f; // 조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; // 자손인 FireEngine타입으로 형변환(생략불가)
Ambulance a = (Ambulance)f; // 에러. 상속관계가 아닌 클래스 간의 형변환 불가
package AFTERCH6;
public class PolymorphismTest {
FireEngine f = new FireEngine();
Ambulance a = new Ambulance();
Car c = (Car)f;
Car c2 = (Car)a;
FireEngine f2 = (FireEngine)c;
// Ambulance a1 = (Ambulance)f; // 자손끼리 불가능
Ambulance a2 = (Ambulance)c; // 조상-자손 관계 가능
}
class Car {
String color;
int door;
void drive(){
System.out.println("Drive");
}
void stop(){
System.out.println("Stop");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water");
}
}
class Ambulance extends Car {
void beep() {
System.out.println("Beep");
}
}
- 만일 객체가 null인데 호출하면 NullPointerException이 발생한다. 따라서, 실제 인스턴스가 무엇인지가 중요하다.
* Instanceof 연산자
- 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true를 반환한다.
- 형변환 전에 반드시 instanceof로 확인해야 함
void doWork(Car c) {
if (c instanceof FireEngine) { // 1. 형변환이 가능한지 확인
FireEngine fe = (FireEngine)c; // 2. 형변환
fe.water();
...}
}
FireEngine fe = new FireEngine();
System.out.println(fe instanceof Object); // true
System.out.println(fe instanceof Car); // true
System.out.println(fe instanceof FireEngine); // true
참조 변수의 형변환은 왜 하나
-> 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서이다.
Instanceof 연산자는 언제 사용하나
-> 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때 사용한다.
'Programming > Java' 카테고리의 다른 글
[JAVA STUDY] 7주차 : 패키지 (0) | 2021.11.15 |
---|---|
[JAVA] 매개변수의 다형성 (0) | 2021.11.09 |
[JAVA] 캡슐화, 다형성 (0) | 2021.11.08 |
[JAVA] 제어자 (0) | 2021.11.08 |
[JAVA STUDY] 6주차 : 상속 (0) | 2021.11.07 |