2) 다운 캐스팅(Down casting)
하위 클래스 데이터 타입으로 형 변환하는 것을 down casting이라고 한다.
주의할 점은 업캐스팅 되기 전의 클래스로만 다운 캐스팅할 수 있다.
예를 들어 아래 예에서 sender[0] 인스턴스를 SMSSender로 다운 캐스팅할 수 없다.
abstract class MessageSender { public void test(){ System.out.println("message"); } } |
public class EMailSender extends MessageSender { public String type = "EMail"; } |
public class SMSSender extends MessageSender { public String type = "SMS"; } |
public class MainClass { public static void main(String args[]) { MessageSender [] senders = {new EMailSender(), new SMSSender()}; System.out.println(((EMailSender)senders[0]).type); System.out.println(((SMSSender)senders[1]).type); } } |
- 잘못된 다운 캐스트와 ClassCastException
컴파일 타임에는 초기화했는 지 여부와 데이터 타입이 맞는 지 검사해준다.
따라서 다운 캐스팅 할 때 잘못된 다운 캐스팅을 했는 지의 여부는 런타임 시 체크하고, 잘못된 경우 런타임 에러가 발생한다.
즉 컴파일은 성공한다.
아래 예제는 다운 캐스팅의 잘못된 예이다. ClassCastException이 발생한 것을 볼 수 있다.
이를 해결하기 위해서는 ‘처음부터’ Student()로 Student의 인스턴스를 만들어야 한다.
public class MainClass { public static void main(String args[]) { Person ps = new Person(); ps = (Student)ps; } } Exception in thread "main" java.lang.ClassCastException: ch06.Person cannot be cast to ch06.Student at ch06.MainClass.main(MainClass.java:6) |
'Java' 카테고리의 다른 글
자바 프로그래밍 (Java) - 31 : 인터페이스 (0) | 2016.07.14 |
---|---|
자바 프로그래밍 (Java) - 30 : 상속과 접근 제한자 (0) | 2016.07.14 |
자바 프로그래밍 (Java) - 28 : 클래스 업캐스팅 (Upcasting) (0) | 2016.07.13 |
자바 프로그래밍 (Java) - 27 : 이름 바인딩 (Name Binding) (0) | 2016.07.13 |
자바 프로그래밍 (Java) - 26 : 상속 (final과 abstract - 2) (0) | 2016.07.13 |