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