본문 바로가기

Java

Java 참조변수의 형변환과 instanceof

 

참조변수의 형변환
- 사용할 수 있는 멤버의 개수를 조절하는 것
- 조상 자손 관계의 참조변수는 서로 형변환 가능(상속관계가 아닌 클래스 간 형변환 불가)

// 조상 Car와 Car를 상속받은 FireEngine과 Ambulance
class Car {}

class FireEngine extends Car {}

class Ambulance extends Car {}


FireEngine f = new FireEngine(); // FireEngine타입 참조변수 f, FireEngine타입의 객체 생성

Car c = (Car)f; // OK. Car타입 참조변수 c, FireEngine타입의 f를 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; // OK. Car타입의 c를 FireEngine타입으로 형변환(생략불가)
Ambulance a = (Ambulance)f; // ERROR. FireEngine타입 f를 Ambulancd타입으로 형변환 불가

👉🏻  형변환 생략 가능/불가능 신경쓰지 말고 생략하지 않는 습관 들이면 문제 발생할 일 없음~~!!

👉🏻 참조변수의 형변환은 기본형의 형변환과 다르게 변수에 저장된 값(주소값)이 변환되는 것이 아님, 같은 주소값을 가지고 있지만 리모컨(참조변수)을 변경하면서 사용할 수 있는 변수의 개수를 늘렸다 줄였다 하는 것


instanceof 연산자
- 참조변수의 형변환 가능 여부를 확인할 때 사용, 형변환이 가능하면 true 반환
- 형변환 전에 반드시 instanceof로 확인 필요

void doWork(Car c) {
    if (c instanceof FireEngin) { // 1. 형변환 가능 가능 여부 확인
        FireEngine fe = (FireEngine)c; // 2. 형변환
        fe.water();
    }
}

 

- 모든 조상 클래스에 대해 true 반환

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

 


형변환 하는 이유

-참조변수(리모컨)를 변경함으로써 사용할 수 있는 멤버의 개수를 조절하기 위해서(멤버 개수를 늘리기 위해서)

- 인스턴스의 원래 기능을 모두 사용하려고, car 타입의 리모컨인 c는 water()를 호출할수 없으니까 FireEngine타입으로 형변환하여 water() 호출


'Java' 카테고리의 다른 글

Java 추상 클래스(abstract class), 추상 메서드(abstract method)  (0) 2022.12.27
Java 매개변수의 다형성  (0) 2022.12.27
Java 다형성(polymorphism)  (0) 2022.12.26
Java 제어자(modifier)  (0) 2022.12.26
Java import문  (0) 2022.12.26