ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 DAY 14. 강제클래스 형변환
    기록 2022. 10. 2. 16:59

    << 자동 클래스형변환과 강제 클래스형변환 >>

    Car car1 = new MediumCar(); // 자동 클래스형변환 발생

    Object obj = car1; // car1의 타입과 object타입이 다르다. 부모 중에서 Object를 찾는다.

    부모객체를 참조하는 super가 있다.

    자동 클래스 형변환이 된다. 따라서, objObject를 바라보게 된다.

    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();
    	}

     

    댓글

Designed by Tistory.