티스토리 뷰


[예제7-15] CastingTest2.java

class CastingTest2 { 
      public static void main(String args[]) { 
            Car car = new Car(); 
            Car car2 = null; 
            FireEngine fe = null; 

            car.drive(); 
            fe = (FireEngine)car;       // 실행 시 에러가 발생한다. 
            fe.drive(); 
            car2 = fe; 
            car2.drive(); 
      } 

[실행결과]
drive, Brrrr~ 
java.lang.ClassCastException: Car 
      at CastingTest2.main(CastingTest2.java:8) 


이 예제는 컴파일은 성공하지만, 실행시 에러(ClassCastException)가 발생한다. 에러가 발생한 곳은 문장은 CastingTest2.java의 8번째 라인인 fe = (FireEngine)car;이며, 발생이유는 형변환에 오류가 있기 때문이다. 캐스트 연산자를 이용해서 조상타입의 참조변수를 자손타입의 참조변수로 형변환한 것이기 때문에 문제가 없어 보이지만, 문제는 참조변수 car가 참조하고 있는 인스턴스가 Car타입의 인스턴스라는데 있다. 전에 배운 것처럼 조상타입의 인스턴스를 자손타입의 참조변수로 참조하는 것은 허용되지 않기 때문이다. 

위의 예제에서 Car car = new Car();를 Car car = new FireEngine();와 같이 변경하면, 컴파일시 뿐 만 아니라 실행 시에도 에러가 발생하지 않을 것이다. 

컴파일시에는 참조변수간의 타입만 체크하기 때문에 실행 시 생성될 인스턴스의 타입에 대해서는 알지 못한다. 그래서 컴파일시에는 문제가 없었지만, 실행 시에는 에러가 발생하여 실행이 비정상적으로 종료된 것이다. 

캐스트연산자를 사용하면, 서로 상속관계에 있는 클래스 타입의 참조변수간의 형변환은 양방향으로 자유롭게 수행될 수 있다. 단, 참조변수가 참조하고 있는 인스턴스의 타입보다 자손타입으로의 형변환은 허용되지 않는다. 



출처 사이트




public class AirPlane extends Vehicle {

int height;


void drive() {

System.out.println("비행기");

};


void takeOff() {

System.out.println("이륙");

};


void landing() {

};


public static void main(String arg[]) {

Vehicle v = new AirPlane();

AirPlane ap3 = (AirPlane)v;


ap3.drive();

}

}


class Vehicle {

int speed;


void drive() {

System.out.println("탈것");

};


void stop() {

};

}


결과 : 

비행기

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함