ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의정석 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 door
    drive()
    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(부모)

    조상 -> 자송의 경우에는 형변환 생략 불가능하다.

     

    헷갈린다면 부모 -> 자식 / 자식 -> 부모 해당 경우 모두 형변환을 적어준다면  문제가없다.

    반응형

    댓글

Designed by Tistory.