- 사용할 수 있는 멤버의 개수를 조절하는 것 - 조상 자손 관계의 참조변수는 서로 형변환 가능
class Car{
String color;
int door;
void drive(){
System.out.println("drive,brrr~");
}
void stop(){
System.out.println("stop!!");
}
}
class FireEngine extends Car{
void water(){
System.out.println("water!!");
}
}
public class Main {
public static void main(String[] args) {
FireEngine f = new FireEngine();
Car c = (Car) f; //자손이 조상의 타입으로 형변환 가능 , 생략 가능
FireEngine f2 = (FireEngine) c; //조상이 자손의 타입으로 형변환 가능, 생략 불가능
c.drive();
f2.stop();
f2.water();
}
}
출력
그림으로 표현
Car 타입의 참조 변수 c는 water()메서드를 호출할 수 없다.
class Car{
String color;
int door;
void drive(){
System.out.println("drive,brrr~");
}
void stop(){
System.out.println("stop!!");
}
}
class FireEngine extends Car {
void water(){
System.out.println("water!!");
}
}
public class Main {
public static void main(String[] args) {
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
fe.water();
car = fe; // 자손이 조상으로 형변환 하는 것은 안전 ,형변환 생략가능
fe2 = (FireEngine) car; // 조상이 자손으로 형변환 하는 것은 위험, 생략 불가능
fe2.water();
}
}
출력
!! 실제 인스턴스가 무엇인지 중요 !! 1) 실제 인스턴스가 null 일때
class Car{
String color;
int door;
void drive(){
System.out.println("drive,brrr~");
}
void stop(){
System.out.println("stop!!");
}
}
class FireEngine extends Car {
void water(){
System.out.println("water!!");
}
}
public class Main {
public static void main(String[] args) {
Car car = null;
FireEngine fe = null;
car = fe;
Car car2 = (FireEngine) car;
car2.drive(); //NullPointerException 발생
}
}
2) 실제 인스턴스가 조상이고, 자손으로 형변환한 경우
class Car{
String color;
int door;
void drive(){
System.out.println("drive,brrr~");
}
void stop(){
System.out.println("stop!!");
}
}
class FireEngine extends Car {
void water(){
System.out.println("water!!");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
FireEngine fe = (FireEngine)car; // 형변환 실행 에러 java.lang.ClassCastException 발생
fe.drive(); //컴파일 ok.
}
}
실제 인스턴스 클래스의 멤버 개수가 형변환 대상 객체의 클래스 멤버 개수보다 작으면 안된다