자바 이문제는 어떻게 푸나요??

  1. 다음 프로그램을 실행하면 casting()메서드가 예외를 발생시킨다. 예외의 원인을 조사하시오. 그리고 casting() 메서드에서 발생한 예외를 메인 메서드가 처리하도록 프로그램을 수정하시오.

    1. 문제 코드

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;

}

}

    3개의 답변이 있어요!

    • 1. 예외의 원인

      캐스팅을 할 수 없는 데이터타입이기 때문입니다.

      Rectangle 타입을 Circle이 동일한 타입이 아니기 때문에 불가능합니다.

      2. casting() 메서드 수정
      해결 방법은 두가지입니다.
      첫번째 상속 관계에 있기 때문에 상속 클래스로 casting 하면 됩니다.
      이렇게 할 경우 Shape에 정의된 public 필드와 메소드만을 활용 할 수 있습니다.

      static void casting(Shape s) { Shape c = s; }


      두번째는 원하는 데이터 타입을 찾아서 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입니다.

      https://wikidocs.net/book/31

      인터넷에서 자유롭게 찾아서 보실 수 있으니 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; } }

      주석 부분에 원하는 메세지를 넣으면 될것 같습니다.