자바 이문제는 어떻게 푸나요??
다음 프로그램을 실행하면 casting()메서드가 예외를 발생시킨다. 예외의 원인을 조사하시오. 그리고 casting() 메서드에서 발생한 예외를 메인 메서드가 처리하도록 프로그램을 수정하시오.
문제 코드
class Shape { }
class Rectangle extends Shape { }
class Circle extends Shape { }
public class CastExceptionTest {
public static void main(String[] args){
Rectangle r = new Rectangle();
casting(r);
}
static void casting(Shape s) {
Circle c = (Circle)s;
}
}
1. 예외의 원인
캐스팅을 할 수 없는 데이터타입이기 때문입니다.
Rectangle 타입을 Circle이 동일한 타입이 아니기 때문에 불가능합니다.
2. casting() 메서드 수정
static void casting(Shape s) { Shape c = s; }
해결 방법은 두가지입니다.
첫번째 상속 관계에 있기 때문에 상속 클래스로 casting 하면 됩니다.
이렇게 할 경우 Shape에 정의된 public 필드와 메소드만을 활용 할 수 있습니다.
두번째는 원하는 데이터 타입을 찾아서 casting 해주는 것입니다.instanceof 를 이용하여 해당 데이터 타입이 어떤것인지 찾고 해당 데이터 타입으로 casting 을 해준다면 해당 데이터타입을 그대로 활용 할 수 있습니다.
static void casting(Shape s) { if(s instanceof Rectangle){ Rectangle r = (Rectangle) s; } else if(s instanceof Circle){ Circle r = (Circle) s; } }try catch finally를 통해 예외 원인을 찾고 그 원인을 프린트하는 문제인듯보입니다.
먼저 try catch finally 문을 연습해보세요.
"점프 투 자바"라고 무료 ebook입니다.
인터넷에서 자유롭게 찾아서 보실 수 있으니 try catch finally 문 chapter (https://wikidocs.net/229)를 찾아서 보시면 문제 해결에 많은 도움이 되실꺼에요.
- import java.lang.*; class Shape { } class Rectangle extends Shape { } class Circle extends Shape { } public class CastExceptionTest { public static void main(String[] args){ Rectangle r = new Rectangle(); try { casting(r); } catch(ClassCastException e) { // 오류 메세지 추가 e.printStackTrace(); } } static void casting(Shape s) { Circle c = (Circle)s; } }
주석 부분에 원하는 메세지를 넣으면 될것 같습니다.