컴퓨터는 잘못이 없다..

[JAVA]다형성3_다운캐스팅 주의할 점 본문

공부/JAVA

[JAVA]다형성3_다운캐스팅 주의할 점

도토리까꿍v 2020. 12. 7. 03:11
Contents 접기

[핵심]

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은 없음!

--> 캐스팅 불가능!

 

 

 

 

Comments