오늘은 클래스 형 변환에 대해서 배웠습니다!
너무 어려운 개념이라서 제가 잘 정리할 수 있을지!
자! 한 번 가보겠습니다!
클래스 형변환
: 부모 타입으로 자식 객체를 참조하면 부모가 가지고 있는 메소드만 사용할 수 있다.
자식은 객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환을 해야한다.
부모가 자식을 가리킬 수는 있지만 --> 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+"리터 들어있습니다.");
}
}
'👩💻 BackEnd > ☕️ 자바 [Java]' 카테고리의 다른 글
[JAVA] 내부클래스 (0) | 2023.04.17 |
---|---|
[JAVA] 인터페이스 default / static 예시 (0) | 2023.04.17 |
[Java] 부모 생성자 super / 오버라이딩 (0) | 2023.04.17 |
[Java] 추상클래스 (0) | 2023.04.17 |
[Java] 상속 / 접근제한자 (0) | 2023.04.16 |