minOS

자바의 정석 ch7-24,25 참조변수의 형변환 본문

TIL/남궁성의 자바의 정석

자바의 정석 ch7-24,25 참조변수의 형변환

minOE 2023. 12. 16. 16:19
728x90

ch7-24 참조변수의 형변환

- 사용할 수 있는 멤버의 개수를 조절하는 것
- 조상 자손 관계의 참조변수는 서로 형변환 가능
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.
    }
}


실제 인스턴스 클래스의 멤버 개수가 형변환 대상 객체의 클래스 멤버 개수보다 작으면 안된다

 

 

728x90