본문 바로가기

JAVA/복습

클래스형변환

클래스 형변환

부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.

자식객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환 해야 한다.

 


형변환

 

Car6.java

   public class Car6{
        public void run(){
            System.out.println("Car6의 run메소드");
        }
    }

 

Bus2.java

    public class Bus2 extends Car{
        public void ppangppang(){
            System.out.println("빵빵.");
        }   
    }

 

BusExam02.java

package Java02;

public class BusExam02 {

    public static void main(String[] args) {

        Car6 c = new Bus2();
        
    }
}

 

버스 객체를 차 타입의 참조 변수로 참조할 수 있다.

부모타입으로 자식객체를 참조하게되면 부모가 가지고있는 메소드만 사용할 수 있다.

 

부모타입인 Car6 라는 타입으로 자식타입인 버스를 이렇게 가르킬 수 있다는 의미.

Car6 c = new Bus2();


부모가 자식을 가리킬 수 있지만, 이 Car6의 c는 Car6가 갖고 있는 run()메소드는 사용하는데 전혀 문제가 없다.
하지만, 실제로 생성된 것은 Bus2가 생성된 것이다.
Bus2는 run() 이 외에도 ppangppang이라는 메소드를 가지고 있는 것을 알고 있을 것이다.
그런데 ppangppang()라는 것을 사용하려고  c.ppangppang() 를 호출하면 컴파일 에러가 난다.

 

  public class BusExam02{
        public static void main(String args[]){
            Car car = new Bus2();
            car.run();
            car.ppangppang(); // 컴파일 오류 발생
        }
    }


이를 통해 알 수 있는 것은

부모타입으로 자식을 가리킬 수 있는 있으나, 부모타입으로 자식을 가리켰을 때 부모가 가지고 있는 것들만 사용할 수 있다.


실제 생성된 인스턴스 Bus()는 빵빵이라고 하는 메소드를 실제 가지고 있다.
그런데 부모 타입으로 가리키고 있으니깐 빵빵메소드를 사용할 방법이 없다.
 나는 이미 있는 기능인데 사용하지 못하는게 억울하다.

난 꼭 쓰고 싶어요!

 

이럴 때 하는 것이 형변환이다.

 - 클래스들 간에도 형변환이 가능하다.


Q. ppangppang()메소드를 호출하고 싶다면?

A. Bus타입의 참조변수로 참조해야 한다.

 

package Java02;

public class BusExam02 {

    public static void main(String[] args) {

        Car6 c = new Bus2();
        c.run();
       // c.ppangppang(); // 컴파일에러

        // 자식의 메소드를 사용하고 싶다면
        // 그랬을때 쓰는 것이 형변환이다.

        Bus2 bus = (Bus2)c;  //부모타입을 자식타입으로 형변환
        bus.run();
        bus.ppangppang();
    }
}

앞에다 c를 Bus타입으로 형변환 해주고 이렇게 바꾼 상태에서

다시 bus 레퍼런스로 bus.메소드로 실행하면 둘다 똑같이 잘 수행된다.

 

Car가 Car타입의 c라는 레퍼런스가 참조하는 것을 Bus타입으로 변환을 시켜서 

다시 Bus타입의 레퍼런스 변수 bus가 참조하도록 한 것이다.

 

이것이 가능한 이유는 car가 참조하는 객체가 원래 Bus2()였기때문에 가능한 것이다.  

 

 

--실행결과

 

 

- 정리 -

 

1. 객체들 끼리도 형변환이 가능하다. 단, 상속관계에 있었을 때만 가능하다.

2. 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.

3. 부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 한다.

     단, 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.

 

 

 

 

 

'JAVA > 복습' 카테고리의 다른 글

인터페이스(interface) 정의  (0) 2021.10.12
[프로그래머스] 클래스형변환 실습(2)  (0) 2021.10.11
오버라이딩(Overriding)  (0) 2021.10.11
super & 부모생성자  (0) 2021.10.11
추상클래스  (0) 2021.10.11