반응형
해당 강의를 보고 정리한 것입니다.
https://programmers.co.kr/learn/courses/5
클래스 형 변환
: 부모 타입으로 자식 객체를 참조하게 되면 부모가 가지고 있는 메서드만 사용할 수 있다. 자식 객체가 가지고 있는 메서드나 속성을 사용하고 싶다면 형 변환해야 한다.
- 부모 Car클래스
public class Car {
public void run() {
System.out.println("Car의 run메서드");
}
}
- 자식 Bus클래스
public class Bus extends Car{
public void ppangppang() {
System.out.println("빵빵");
}
}
- 부모 타입으로 자식 객체 참조하기
- 이 경우 부모가 가지고 있는 메서드만 사용 가능, 객체는 Bus의 객체로 생성됨.
public class BusExam {
public static void main(String[] args) {
Car car = new Bus();
car.run();
}
}
>> Car의 run메서드
- 형 변환 하기
public class BusExam {
public static void main(String[] args) {
Car car = new Bus();
car.run();
Bus bus = (Bus)car;
bus.run();
bus.ppangppang();
}
}
>>
Car의 Run메서드
Bus의 Run메서드
빵빵
- 객체들끼리도 형 변환이 가능하다
- 부모 타입으로 자식 타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.
- 자식 타입으로 부모 타입의 객체를 바로 참조하려면 오류가 발생한다.
따라서 자식 타입으로 부모 타입의 객체를 참조하게 할 때는 명시적으로 형 변환을 해줘야 한다.
단, 부모가 참조하는 인스턴스가 형 변환하려는 자식 타입일 때만 가능
- 잘못된 예
>> ClassCastException 오류가 발생한다!!!- 옳바른 예Car car2 = new Car(); Bus bus2 = (Bus)car2; bus2.run();//오류 발생
근데 이렇게 쓰는 경우가 있을까 ? 그냥 처음부터 Bus로 인스턴스를 생성하면 될텐데... 후에 혹시라도 사용하는 경우를 발견하게 되면 기록을 남겨야겠다.Car car2 = new Bus(); Bus bus2 = (Bus)car2; bus2.run();
- 만약 Bus클래스에 run()을 오버 라이딩한다면? 강의에 없는 내용이라 직접 테스트해보았다.
public class Bus extends Car{
public Bus(){
super();
// System.out.println("Bus의 기본생성자");
}
public void run() {
System.out.println("Bus의 Run메서드");
}
public void ppangppang() {
System.out.println("빵빵");
}
}
- 결과
public class BusExam {
public static void main(String[] args) {
Car car = new Bus();
car.run();
}
}
>> Bus의 Run메서드
이유?
- 먼저 Bus로 객체를 생성 후 Car로 형 변환을 해줘서 car.run(); 의 결과가 Bus의 Run메서드가 실행된 걸로 보인다.
반응형
'Language > Java' 카테고리의 다른 글
자바 입문하기16 - 내부클래스 (0) | 2022.01.12 |
---|---|
자바 입문하기15 - 인터페이스 (0) | 2022.01.12 |
자바 입문하기13 - 상속, 접근제한자, 추상클래스, super (0) | 2022.01.11 |
자바 입문하기12 - 오버로딩, 오버라이딩, this(), 패키지 (0) | 2022.01.11 |
자바 입문하기11 - 생성자, this (0) | 2022.01.11 |