CH7-24,25 참조변수의 형변환(2)

[자바의 정석 - 기초편] ch7-24,25 참조변수의형변환(2)

실습을 해보자.

public class EX7_15 {
	public static void main(String[] arg) {
		Car car = null;
		FireEngine fe = null;
		
		FireEngine fe2 = (FireEngine)car;
		Car car2 = (Car)fe2;
		car2.dirve();
	}
}

class Car {
	String color;
	int door;
	
	void Car() {
		this.color = "white";
		this.door = 4;
	}
	
	void dirve() {
		System.out.println("drive~");
	}
	
	void stop() {
		System.out.println("stop!");
	}
}

class FireEngine extends Car {
	void water() {
		System.out.println("water!");
	}
}

위의 예제는 null 포인트 참조 오류가 난다.

Untitled

즉 형변환시에는 실제 메모리상의 인스턴스가 무엇인지를 따져야 한다. 그 인스턴스의 멤버변수가 몇 개인지가 중요하다.

만약 메모리상에 있지도 않은 멤버변수를 형변환으로 다루려고 하면, 컴파일시에는 오류가 없다. 자바컴파일러가 안잡아줌. 하지만 런타임동안 그 멤버변수를 다루려고 할때 런타임 오류가 난다.

ClassCastExpection이라는 메세지가 나옴.

CH7-26 instanceof연산자

[자바의 정석 - 기초편] ch7-26 instanceof 연산자

instanceof연산자는 형변환이 가능한지 여부에 사용하는 연산자로, 가능하면 true를 반환한다.

형변환 하기 전에는 반드시 instanceof연산자로 확인하고 형변환하는 습관을 갖자.

즉 if문으로 instanceof가 true를 반환하면 형변환 되게 코딩하는 습관을 가져야 함.

안전하게 다형성이란 특징을 이용하기 위해선 위의 습관이 중요함.

참고로 instanceof는 조상 클래스에 대해서도 true를 반환한다. 이 문법을 기억해야 instanceof를 잘 사용할 수 있다. 따라서 모든 클래스는 instanceof Object하면 다 true를 반환함

여기서 제일 중요한걸 다시 정리해주겠다.