-
자바의정석 Ex7_7(다형성)Java/자바의정석 2023. 2. 20. 16:13반응형
package Chap07; class Ex7_7 { public static void main(String args[]) { Car car = null; //Car타입의 car 참조변수에 null 값 대입 FireEngine fe = new FireEngine(); //FireEngine를 참조하는 fe 참조변수 생성 FireEngine fe2 = null; //FireEngine을 참조하는fe2참조변수 //FireEngine -> water()까지 사용가능 //Car참조하는 변수는 water() 사용 불가능 //Car -> 조상 , FireEngine -> 자손 fe.water(); car = fe; // car = (Car)fe;에서 형변환이 생략됨, 자손->부모 생략가능 // car.water(); -> car는 Car를 참조하기때문에 water()메소드 사용 불가능 fe2 = (FireEngine)car; // 자손타입 ← 조상타입. 형변환 생략 불가 fe2.water(); } } class Car { String color; int door; void drive() { // 운전 System.out.println("drive, Brrrr~"); } void stop() { //정지 System.out.println("stop!!!"); } } class FireEngine extends Car { // void water() { // System.out.println("water!!!"); } }
========실행결과=========
water!!!
water!!!Car String color int doordrive() stop() Car클래스는 color, door 인스턴스 변수와 drive(), stop()두개의 메서를 가지고 있습니다.
이러한 Car 클래스를 상속받은 FireEngine 클래스의 경우는
FireEngine String color int door drive() stop() water() water()메서드와 부모의 인스턴스 변수와 메서드를 상속받아 위와같은 그림이 된다.
Car car = null; //Car타입의 car 참조변수에 null 값 대입 FireEngine fe = new FireEngine(); //FireEngine를 참조하는 fe 참조변수 생성 FireEngine fe2 = null; //FireEngine을 참조하는fe2참조변수
참조변수 자료형 + 참조변수명 = new(메모리 인스턴스 생성) + 생성자
main에서는 FireEngine을 참조변수 자료형으로 하여 fe참조변수를 생성하였다.
fe.water();
FireEngine의 경우 water()메서드를 포함하고있으니 호출이 가능하다.
car.water();
하지만 참조변수 car를 이용하여 water()를 호출하려고한다면 car는 Car클래스를 참조하기때문에
Car클래스에는 water()메서드가 없기때문에 호출이 불가능하다.
car = fe; // car = (Car)fe;에서 형변환이 생략됨, 자손->부모 생략가능
fe가 참조하는타입 -> FireEngine (자식)
car가 참조하는 타입 -> Car(부모)
형변환의 경우 자손 -> 부모의 경우에는 형변환 생략이 가능하다.
fe2 = (FireEngine)car; // 자손타입 ← 조상타입. 형변환 생략 불가 fe2.water();
fe2가 참조하는 타입 -> FireEngine(자식)
car가 참조하는 타입 -> Car(부모)
조상 -> 자송의 경우에는 형변환 생략 불가능하다.
헷갈린다면 부모 -> 자식 / 자식 -> 부모 해당 경우 모두 형변환을 적어준다면 문제가없다.
반응형'Java > 자바의정석' 카테고리의 다른 글
자바의정석 Ex7_10 추상 클래스, 추상 메서드 (0) 2023.02.21 자바의 정석 Ex7_9 (하나의 배열에 여러종류의 객체 저장) (0) 2023.02.20 자바의 정석 (this, super)의 이해 (0) 2023.02.20 자바의 정석 Ex7_2 (this, super) (0) 2023.02.20 자바의 정석 Ex7_1 (클래스 초기화, 인스턴스 초기화) (0) 2023.02.20