Programming/Java

[JAVA] 참조변수의 형변환, Instanceof 연산자

Supreme_YS 2021. 11. 9. 13:54

자바의 정석 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