자바/Java 참조변수의 형변환이란?
기본형 변수와 깉이 참조변수도 형변환이 가능하다. 단, 서로 상속관계에 있는 클래스사이에만 가능하기 때문에 자손타입의 참조변수를 조상타입의 참조변수로, 조상타입의 참조 변수를 자손타입의 참조변수로의 형변환만 가능하다.
기본형 변수의 형변환에서 작은 자료형에서 큰 자료형의 형변환은 생략이 가능하듯이, 참조형 변수의 형변환에서는 자손타입의 참조변수를 조상타입으로 형변환하는 경우에는 형변환을 생략할 수 있다.
자손타입 -> 조상타입 (Up-castion) : 형변환 생략가능
자손타입 <- 조상타입 (Down-castion) : 형변환 생략불가
1) CarCastingTest.java
package arabiannight.tistory.com.java.test; public class CarCastingTest { public static void main(String[] args) { Car c = new Car(); FireEngine f = new FireEngine(); c = f; // (Up-casting) // (Up-castion : 조상타입의 참조변수로 자손의 인스턴스를 참조하는 구조) // Car c는 자손인 FireEngine인스턴스를 참조할 수 있다. c.drive(); // c.warter(); (실행불가) f = (FireEngine)c; // (Down-casting) // (Down-castion : 자손타입의 참조변수로 조상의 인스턴스를 참조하는 구조) // 하지만 Car c 참조변수는 자손(FireEngine)의 인스턴스를 참조하고 있다. // 결국 FireEngine f는 FireEngine 인스턴스를 참조하는 구조이다. f.drive(); f.water(); c = new Car(); f = (FireEngine)c; // (Down-casting) // 여기서 Car c 참조변수는 Car 자신의 인스턴스를 참조하고 있다. // 그렇기 때문에 FireEngine f 참조변수는 조상인 Car 인스턴스를 참조하기 때문에 // Exception이 발생 한다. // 이렇듯 Car c가 Car인스턴스를 참조하고 있는 경우가 있을 수 있기 때문에 // Down-cating은 생략할 수 없다. // f = (FireEngine)c; 컴파일시 Exception 발생 f.drive(); f.water(); } } class Car { String color; int door; void drive() { //운전하는 기능 System.out.println("drive, brrrr~"); } void stop() { // 멈추는 기능 System.out.println("stop!!!"); } } class FireEngine extends Car { // 소방차 void water() { // 물 뿌리는 기능 System.out.println("warter!!!"); } } class Ambulance extends Car { // 앰뷸런스 void siren() { // 사이렌을 울리는 기능 System.out.println("siren~~~~"); } }
실행결과 :
drive, brrrr~ drive, brrrr~ Exception in thread "main" java.lang.ClassCastException: arabiannight.tistory.com.java.test.Car cannot be cast to arabiannight.tistory.com.java.test.FireEngine at arabiannight.tistory.com.java.test.CarCastingTest.main(CarCastingTest.java:26) warter!!!
<정리>
1) 상속관계일 경우 조상과 자손의 참조변수는 형변환이 가능 하다.!
2) 단 절대!! 참조변수가 참조하고 있는 인스턴스를 주의 해야 한다.
(조상의 참조변수는 조상 인스턴스와 자손 인스턴스 둘 중 어떤 것을 참조 하고 있는지는 모른다.)
(이런 문제를 위해 instanceof 연산자를 사용하여 형변환이 가능한지 검사 할 수 있다.)
출처 : 자바의 정석
'JAVA > 개념정리' 카테고리의 다른 글
자바/Java 자바의 다형성이란? (1) | 2013.01.14 |
---|---|
자바/Java instanceof 연산자란? (1) | 2013.01.14 |
자바/Java 자바 용어 정리 ~! (0) | 2013.01.03 |
자바/Java break문, contunue문, 이름 붙은 반복문 사용법 (0) | 2012.07.12 |
자바/Java JVM 메모리 구조 (0) | 2012.07.03 |