👩💻 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.
어... 점점 힘들어지다보니까... 양이 줄어든다..