👩‍💻 BackEnd/☕️ 자바 [Java]

[Java] 자바의 정석 : 참조변수의 형변환

minhe2810 2024. 2. 23. 16:06

참조변수의 형변환 

: 사용할 수 있는 멤버의 갯수를 조절하는 것을 의미 

: 조상 - 자손 관계의 참조변수는 서로 형변환 가능 

 

참조변수 멤버의 개수를 줄이는 것은 안전 

하지만 참조 변수의 개수를 늘리는 것은 위험, 따라서 형변환을 꼭 명시 해줘야 한다. 

 

package pkg2;

public class Ex7_7 {
    public static void main(String[] args) {

        Car car;
        FireEngine fe = new FireEngine();
        FireEngine fe2 = null;

        fe.water();
        car = fe;

//        car.water(); // error Car 클래스에 멤버변수로 water 가 없음

        fe2 = (FireEngine) car; // 자손 타입 <- 조상 타입. 형변환 생략 불가능
        fe2.water();  // FireEngine 타입이기 때문에 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 !!! ");
    }
}

 

 

형변환 시 주의할 점 

  • 실제 인스턴스가 중요!  가리키는 인스턴스 객체가 실제 몇개의 멤버를 갖고 있느냐! 
  • null 인 인스턴스를 형변환하고 대입하면 NullPointException 이 발생함. 

 

public class Ex7_7 {
    public static void main(String[] args) {

        Car car = new Car();
        FireEngine fe = (FireEngine) car; // 형변환 실행 에러 : java.lang.ClassCastException
        fe.water(); // 컴파일 OK! But, 실행 시 에러 발생
    }
}

 

왜 fe.water(); 를 하면 에러가 발생할까? 

왜냐하면 fe 는 원래 Car 인스턴스였기때문에 water 라는 메서드를 가지고 있지 않다. 

 

따라서 참조변수 간의 형변환이 중요한 것이 아니라

실제 객체가 뭔지가 중요한 것이다. 

 

Car 인스턴스의 멤버가 4개이므로 

4개의 범위를 벗어나면 안된다. 

 


instanceof 연산자 

: 참조변수의 형변환 가능 여부 확인에 사용. 가능하면 true 반환 

 

instanceof 연산자로 형변환이 가능한지 그 여부를 확인해본 후에 형변환을 해야함.

반드시 instanceof 로 확인하고 형변환 해야함.

 

형변환을 하는 이유는 인스턴스의 원래의 기능을 모두 사용하기 위해서 함. 

Car 타입의 리모콘인 c로는 water() 메서드를 사용할 수 없으니까 

리모콘을 FireEngine 타입으로 바꿔서 water() 를 호출 

 

하지만 연산자 instanceof 는 조상에 대해서도 true 를 반환한다. 

즉, 자기 자신, 조상 타입에 대해서 true를 반환하는 연산자 

 

 

 

 

ps. 

어... 점점 힘들어지다보니까... 양이 줄어든다..