-
학원 DAY 14. 강제클래스 형변환기록 2022. 10. 2. 16:59
<< 자동 클래스형변환과 강제 클래스형변환 >>
Car car1 = new MediumCar(); // 자동 클래스형변환 발생
Object obj = car1; // car1의 타입과 object타입이 다르다. 부모 중에서 Object를 찾는다.
부모객체를 참조하는 super가 있다.
자동 클래스 형변환이 된다. 따라서, obj는 Object를 바라보게 된다.
car1의 참조변수가 LightCar를 바라보게 하고 싶다면
LightCar car2 = car1; // 자동형변환이 안됨. 부모중에 LightCar가 없기 때문에
LightCar car2 = (LightCar) car1; // 강제 클래스형변환 발생, LightCar를 바라보게 됨.
<< 강제 클래스 형변환 >>
- 실제로 생성한 하위클래스 타입의 객체를 상위클래스 타입의 참조변수가 참조하고 있는 경우, 실제 생성한 객체의 속성과 기능을 사용할 수 없다.
- 실제로 생성한 객체가 클래스 형변환 되어서 참조되고 있는 경우, 실제 생성한 객체를 참조하기 위해서는 강제 클래스형변환이 필요하다.상위클래스타입 참조변수1 = new 하위클래스타입(); // 자동 클래스 형변환
* 참조변수1은 하위클래스타입 객체의 고유한 속성과 기능을 사용할 수 없음.
하위클래스타입 참조변수2 = (하위클래스타입) 참조변수1; // 강제 클래스 형변환
* 참조변수1이 참조하는 객체에서 지정된 하위클래스타입의 객체의 주소값을 참조변수2에 대입시킨다.
* 참조변수2는 하위클래스타입 객체의 고유한 속성과 기능을 사용할 수 있다.
package day13.car; public class CarApp3 { public static void main(String[] args) { System.out.println("### MediumCar객체를 Car타입의 참조변수로 참조하고 있다."); Car car1 = new MediumCar(); car1.speedUp(); // Car객체의 공개된 기능이다. car1.speedDown(); // Car객체의 공개된 기능이다. car1.drive(); // Car객체의 공개된 기능이다. car1.stop(); // Car객체의 공개된 기능이다. // car1 참조변수가 참조하는 객체는 실제로 MediumCar객체를 생성했을 때 생성된 Car객체다. // car1 참조변수가 참조하는 객체의 MediumCar객체를 참조하게 할 수 있다. System.out.println("### 강제 클래스형변환으로 참조변수가 MediumCar객체를 참조하고 있다."); MediumCar car2 = (MediumCar) car1; car2.speedUp(); // Car객체의 공개된 기능이다. car2.speedDown(); // Car객체의 공개된 기능이다. car2.drive(); // Car객체의 공개된 기능이다. car2.stop(); // Car객체의 공개된 기능이다. car2.audio(); // LightCar객체의 공개된 기능이다. car2.aircon(); // MediumCar객체의 공개된 기능이다. car2.navigation(); // MediumCar객체의 공개된 기능이다. // 참조변수를 사용하지 않고, 강제형변환해서 기능 사용하기 System.out.println("### 참조변수를 사용하지 않고, 강제형변환해서 기능 사용하기"); ((LightCar) car1).audio(); ((MediumCar)car1).navigation(); // car1 참조변수가 참조하는 객체는 실제로 MediumCar객체를 생성했을 때 생성된 Car객체다. // car1 참조변수가 참조하는 객체의 어디에도 LuxuryCar객체는 존재하지 않는다. // 프로그램 실행싯점에 LuxuryCar car3 = (LuxuryCar) car1; 이 코드에서 ClassCastException 예외가 발생한다. // ClassCastException은 클래스형변환이 올바르지 않을 때 발생하는 오류다. LuxuryCar car3 = (LuxuryCar) car1; // 오류는 안나지만 car1은 MediumCar만들때 이미 사용했기 때문에 실행 오류. 실수하기 쉬우니 조심! car3.speedUp(); car3.speedDown(); car3.drive(); car3.stop(); car3.audio(); car3.aircon(); car3.navigation(); car3.autoDrive(); }
'기록' 카테고리의 다른 글
학원 DAY 15. 추상화, 인터페이스, 추상클래스 (0) 2022.10.02 학원 DAY 14. 메소드 재정의(오버라이딩) (0) 2022.10.02 학원 DAY 13. 클래스 형변환 (0) 2022.10.02 학원 DAY 13. 상속, SUPER (0) 2022.10.02 학원 DAY12. 클래스와 클래스의 관계, 상속 (0) 2022.10.02