안녕하세요. 스마트 팩토리입니다.
자바 중급 031. 다형성(polymorphism)- 형 변환, 다운 캐스팅, 업캐스팅 에러 ClassCastException 해결 방법에 대해 알아보겠습니다.
1. 형변환
가. 다형성으로 인한 형변환
(1) 형변환 전제조건
- 상속, 구현 관계에 있는 것만 객체 타입 변환이 가능함
-자손 타입에서 조상타입으로 형변환시 생략가능
car1=spo1;
-조상타입에서 자손타입으로 형변환시 반드시 명시해야 한다.
spo2=(SportCar)car1;
(2) 업 캐스팅(UPcasting)- 자손 타입을 조상 타입으로 형변환 ( 형변환 생략 가능) - 멤버갯수 줄어듬
(3) 다운 캐스팅(Down cating) -조상 타입을 자손 타입으로 형변환( 형변환 생략 불가)- 멤버갯수 많아짐
나. 다형성으로 인한 형변환 예제
<<Car. java 조상클래스>>
Car 클래스로 조상클래스 (부모클래스)입니다.
인스턴스 변수 2개와 메소드 3개로 구성했습니다.
package example03;
public class Car {
String color;
int door;
public void drive() {
System.out.println(" Car 클래스 : 차가 운행중");
}
public void stop() {
System.out.println(" Car 클래스 : 차가 운행중지");
}
public void show() {
System.out.println("색상 :"+this.color+" 도어 : "+this.door);
}
}
<<SportCar.java 자손클래스(1)>>
Car클래스의 자식 클래스(자손클래스) 1번으로 SportCar클래스 입니다. 멤버메소드만 3개이지만 마지막 show 메소드만 오버라이딩을 했습니다.
package example03;
public class SportCar extends Car{
public void SpeedUp() {
System.out.println("SportCar 클래스: 속도 Up");
}
public void SpeedDown() {
System.out.println("SportCar 클래스: 속도 Down");
}
@Override
public void show() {
super.show();
System.out.println("스피드 Up and Down 가능");
}
}
<< PoliceCar.java 자식클래스(2)>>
Car클래스의 자식 클래스(자손클래스) 2번으로 PoliceCar클래스 입니다. 역시 멤버메소드만 3개이지만 마지막 show 메소드만 오버라이딩을 했습니다.
package example03;
public class PoliceCar extends Car{
public void SirenOn() {
System.out.println("PoliceCar 클래스: 사이렌 On");
}
public void SirenOff() {
System.out.println("PoliceCar 클래스: 사이렌 Off");
}
@Override
public void show() {
super.show();
System.out.println("사이렌 ON and OFF 가능");
}
}
<<CarEx.java 메인 실행클래스>>
객체로 car1, car2를 만들었습니다. null로 있는 경우는 주소값도 null로 나온다는것을 알 수 있습니다.
여기서 주목할 부분이 있는데 업캐스팅하고 다운 캐스팅입니다.
다운 캐스팅을 위해서는 업캐스팅을 하고 해야 한다는 것입니다. 그렇지 않으면 컴파일러 상으로는 문제가 되지 않지만 에러가 발생합니다.
그래서 형변환이 문제가 아니고 프로그램을 제대로 작동시키기 위해서는 객체를 구성하고 있는 멤버의 갯수와 조작 범위를 파악하는 것이 중요합니다.
형변환하는 원리를 파악하는 것도 중요하지만 형변환을 해야하는 이유를 파악하고 에러가 발생하는 경우는왜 그런지를 알아야 합니다.
package example03;
public class CarEx {
public static void main(String[] args) {
Car car1=null;
Car car2=new Car();
SportCar sc1=new SportCar();
PoliceCar pc1=new PoliceCar();
System.out.println(car1);
System.out.println(car2);
System.out.println("--------------");
car1=sc1;--> 업캐스팅
car1.show();
System.out.println(car1);
sc1=(SportCar)car1; -> 다운 캐스팅
sc1.drive();
sc1.show();
System.out.println(sc1);
System.out.println("--------------");
car2=pc1; --> 업캐스팅
car2.show();
pc1=(PoliceCar)car2; -> 다운 캐스팅
pc1.drive();
pc1.show();
System.out.println(pc1);
}
}
에러 코드를 잠시 보면
다. ClassCastException 원인
java.lang.ClassCastException: class example03.Car cannot be cast to class example03.PoliceCar (example03.Car and example03.PoliceCar are in unnamed module of loader 'app')
at example03.CarEx.main(CarEx.java:26)
컴파일 상은 문제가 없으니 캐스팅 즉 형변환을 할 수 없다는 것입니다.
형변환이라는 것을 할 필요가 있다면 그 포맷에 맞춘다음에 그대로 하면 된다는 생각이 들었습니다. 그래서 먼저 업캐스팅을 하고 그 다음에 다운 캐스팅을 하면 형변환에 큰 문제가 없다는 것입니다.
'Java' 카테고리의 다른 글
자바 중급 033. 다형성(polymorphism)- instanceof연산자- 예제2(부모클래스, 자식클래스 매개변수로 접근 가능여부) (0) | 2021.09.25 |
---|---|
자바 중급 032. 다형성(polymorphism)- instanceof연산자- 형변환 가능 여부 확인,Ctrl+T- 상속관계 확인 (0) | 2021.09.24 |
자바 중급 030. 다형성(polymorphism)- 부모클래스 참조변수로 자식클래스 접근 (0) | 2021.09.22 |
자바 중급 029. 참조 변수 super 조상클래스 참조변수 (0) | 2021.09.14 |
자바 중급 028. 오버라이딩(overriding) 조건-재정의- Object 클래스 toStirng ()메소드 (0) | 2021.09.13 |
댓글