컴퓨터는 잘못이 없다..
[JAVA]다형성3_다운캐스팅 주의할 점 본문
[핵심]
1. 다운캐스팅 시 주의할 점을 살펴보자.
[예제코드]
MainClass05.java
package test.main;
/*
여러분이 키우는 자녀가 있다고 가정하자
자녀가 현재 사용하는 핸드폰이 인터넷이 안되는 구형 폰이다.
여러분의 자녀가 인터넷을 하고 싶어서 스마트폰이 갖고 싶다고 조른다.
여러분은 어떻게 할 것인가?
1. 스마트폰을 새로 사준다.(만들어서 준다.)
2. 스마트폰의 사용설명서만 가지고 와서 현재 폰의 설명서라고 우기고 그냥 그 폰을 쓰라고 한다.
--> 아래 예제는 2번 같은 경우
아래 예제는 MainClass03과 비교해볼 것!
*/
import test.mypac.Phone;
import test.mypac.SmartPhone;
public class MainClass05 {
public static void main(String[] args) {
//아래예제와 같은 상황을 조심할 것!
Phone p1 = new Phone();
//p1은 Phone 타입(부모) 이므로 형변환 해주어야한다.
//그러나 이 코드는 실행해보면 오류가 난다.
//p1은 원래부터 스마트폰 기능이 없다.(그림으로 이해하기!)
SmartPhone p2 = (SmartPhone)p1;
}
}
MainClass05.java 실행결과
Phone 생성자 호출됨
Exception in thread "main" java.lang.ClassCastException: test.mypac.Phone cannot be cast to test.mypac.SmartPhone
at test.main.MainClass05.main(MainClass05.java:25)
[코드 설명]
1. 다운캐스팅 시 주의해야할 사항
▼다운캐스팅 예제를 그림으로 표현해보았다.
└new HandPhone() 하게 되면 Object, Phone, HandPhone이 생성되며 하나의 주소(20번지)로 관리된다.
그걸 Object p1에 대입하면 p1은 Object타입이므로 Object의 메소드만 참조가 가능하다.
└이때 p1을 Phone타입으로 다운캐스팅 한 후 p2에 대입하게 되면 p2는 20번지를 가리키며 p2의 타입이 Phone타입이기 때문에 Object와 Phone필드와 메소드를 참조할 수 있다.
└이런방식으로의 다운캐스팅은 가능하다!
▼MainClass05.java를 그림으로 표현해보았다.
└new Phone()하게 되면 Object와 Phone이 생성되며 한개의 주소로 관리된다.(21번지)
이것을 Phone p1에 대입하면 p1은 Object, Phone의 필드와 메소드를 참조가능하다.
└이때 p1을 SmartPhone으로 다운캐스팅 한 후 p2에 대입하면 p2는 21번지를 가리키게 된다.
└이런방식으로 다운캐스팅 하게되면 문제가 발생한다. 21번지에는 SmartPhone이 없는데 강제로 SmartPhone으로 형변환 한다는 것은 SmartPhone 사용설명서만 가져와서 Phone을 SmartPhone이라고 우기는 것과 같은 상황이다.
2. 앞으로 다운캐스팅 할 때 체크해야 할 것
예1)
step1) 다운캐스팅 할 타입 확인 --> Phone
Phone p2=(Phone)p1;
step2) p1에 Phone이 있는지 확인
Object p1=new Phone();
--> new Phone() 은 Object, Phone 생성됨 그걸 p1에 대입 p1에는 Phone있음!
--> 캐스팅 가능!
예2)
step1) 다운캐스팅 할 타입 확인 --> SmartPhone
SmartPhone p2=(SmartPhone)p1;
step2) p1에 SmartPhone이 있는지 확인
Phone p1=new Phone();
--> new Phone()은 Object, Phone 생성됨 그걸 p1에 대입 p1에 SmartPhone은 없음!
--> 캐스팅 불가능!
'공부 > JAVA' 카테고리의 다른 글
[JAVA]java.lang패키지 Object클래스/Object클래스와 업캐스팅, 다운캐스팅 (0) | 2020.12.07 |
---|---|
[JAVA]다형성2_업캐스팅과 다운캐스팅(상속/다형성/업캐스팅과 타운캐스팅) (0) | 2020.12.06 |
[JAVA]다형성1_다형성이란?(상속과 다형성) (0) | 2020.12.05 |