본문 바로가기

👩‍💻 BackEnd/☕️ 자바 [Java]

[Java] 클래스 형변환

오늘은 클래스 형 변환에 대해서 배웠습니다! 

 

너무 어려운 개념이라서 제가 잘 정리할 수 있을지!

 

자! 한 번 가보겠습니다! 

 

클래스 형변환 

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

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

 

부모가 자식을 가리킬 수는 있지만 --> Car c = new Bus();

: 버스 타입을 자동차 타입이 가리키고 있다. 자동차 타입이 훨씬 큰 그릇이기 때문에 무리 없이 가리킬 수 있음.

이 경우, 부모가 가지고 있는 내용만 사용가능 --> c.run(); //OK

                                                                          c.ppangppang(); // 자식이 가진 내용으로 사용 X 

 

Bus는 실제로 ppangppang메서드를 가지고 있지만 부모 타입으로 가리켰기때문에 ppangppang메서드는 사용할 수 없음!

 

하지만 이미 있는 기능인데 사용할 수 없다니… 방법이 없는 것이 아니다! 
사용하고 싶을 때는! 바로 형변환이 필요하다. 형변환을 해야지 객체가 갖고 있는 모든 부분들 사용할 수 있다.

 

자식 자식변수 = (자식) 부모();  --> 부모를 자식타입으로 형변환하는 방법 

ex ) 

 

Bus bus = (Bus) Car ();
bus.run();
bus.ppangppang();

 

 

이런 식으로! 

 

- 객체들끼리 형변환이 가능하다! 하지만 상속관계에서만 가능! 

- 자식타입 객체를 부모타입으로  참조 시 묵시적 형변환이 일어남.

- 부모타입을 자식타입으로 참조 시 반드시 명식적 형변환을 해야함. 

Bus bus = c; //Car 타입이 더 큰데? 
Bus bus = (Bus) Car;
bus.run();
bus.ppangppang();

 

** Tip ! 변수 타입을 변경해줄 때와 같이 어떤 것이 더 큰 그릇인지 생각해보기! 

 

 

<참고 예제>

public class GasStation{
    public static void main(String[]args){
        GasStation gasStation = new GasStation(); //gasStation인스턴스 생성

    Suv suv = new Suv(); //suv 인스턴스 생성
        Truck truck = new Truck(); //truck 인스턴스 생성
        Bus bus = new Bus(); //bus 인스턴스 생성

        //gasStation에서 suv에 기름을 넣습니다.
        gasStation.fill(suv);

        //gasStation에서 truck에 기름을 넣습니다.
        gasStation.fill(truck);

        //gasStation에서 bus에 기름을 넣습니다.
        gasStation.fill(bus);

    }

//  public void fill(Suv suv){
//      System.out.println("Suv에 기름을 넣습니다.");
//      suv.gas += 10;
//      System.out.println("기름이 "+suv.gas+"리터 들어있습니다.");
//  }

//  public void fill(Truck truck){
//      System.out.println("Truck에 기름을 넣습니다.");
//      truck.gas += 10;
//      System.out.println("기름이 "+truck.gas+"리터 들어있습니다.");
//  }

//  public void fill(Bus bus){
//      System.out.println("Bus에 기름을 넣습니다.");
//      bus.gas += 10;
//      System.out.println("기름이 "+bus.gas+"리터 들어있습니다.");
//  }

    public void fill(Car car){
        //참고. car.getClass().getName()은 car오브젝트가 실제로 어떤 클래스인지를 알려줍니다.
        System.out.println(car.getClass().getName()+"에 기름을 넣습니다.");

        car.gas += 10;
        System.out.println("기름이 "+car.gas+"리터 들어있습니다.");
    }
}