코딩하는 털보

OOP - 31 본문

IT Study/JAVA OOP

OOP - 31

이정인 2020. 12. 18. 19:38

객체 지향 프로그래밍

31. 다운캐스팅과 instanceof

  • 다운캐스팅
    묵시적으로 업캐스팅된 인스턴스가 원래의 자료형(하위 클래스)으로 변환되어야 할 때 사용.
    다운캐스팅은 명시적으로 이루어진다.
Customer vc = new VIPCustomer(); //업캐스팅 - 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; //다운캐스팅 - 명시적
package polymorphism;

import java.util.ArrayList;

class Animal {

    public void move() {
        System.out.println("동물이 움직입니다.");
    }
}

class Human extends Animal {

    @Override
    public void move() {
        System.out.println("사람이 두 발로 걷습니다.");
    }

    public void readBooks() {
        System.out.println("사람이 책을 읽습니다.");
    }
}

class Tiger extends Animal {

    @Override
    public void move() {
        System.out.println("호랑이가 네 발로 뜁니다.");
    }

    public void hunting() {
        System.out.println("호랑이가 사냥을 합니다.");
    }
}

class Eagle extends Animal {

    @Override
    public void move() {
        System.out.println("독수리가 하늘을 날아갑니다.");
    }

    public void flying() {
        System.out.println("독수리가 날개를 쭉 펴고 멀리 날아갑니다.");
    }
}

public class AnimalTest {

    public static void main(String[] args) {

        Animal hAnimal = new Human();
        Animal tAnimal = new Tiger();
        Animal eAnimal = new Eagle();

        //Eagle eagle = (Eagle)hAnimal; //Error발생, Human 인스턴스를 Eagle로 형변환하려고함
                                        //다운캐스팅은 새로운 선언type과 캐스팅type만 비교하므로 경고가 없기때문에 이런 문제가 발생할 수 있음.
        /*if (hAnimal instanceof Eagle) {    //inatanceof는 인스턴스의 타입을 확인하여 true,false 반환
            Eagle eagle = (Eagle)hAnimal;  //실행되지 않기 때문에 Error 없음.
            eagle.flying();
        } else if (hAnimal instanceof Human) {
            Human human1 = (Human)hAnimal;
            human1.readBooks();
        }*/

        ArrayList<Animal> animalList = new ArrayList<Animal>();
        animalList.add(hAnimal);
        animalList.add(tAnimal);
        animalList.add(eAnimal);

        AnimalTest test = new AnimalTest();
        test.testDownCasting(animalList);
    }

    public void testDownCasting(ArrayList<Animal> list) {
        for(int i=0; i<list.size(); i++) {  //Animal 인스턴스들의 type을 확인한 후 다운캐스팅하는 for문 
           Animal animal = list.get(i);

           if (animal instanceof Human) {
               Human human = (Human)animal;
               human.readBooks();
           } else if (animal instanceof Tiger) {
               Tiger tiger = (Tiger)animal;
               tiger.hunting();
           } else if (animal instanceof Eagle) {
               Eagle eagle = (Eagle)animal;
               eagle.flying();
           } else {
               System.out.println("Error");
           }
        }
    }

    public void moveAnimal(Animal animal) {
        animal.move();
    }

}

보통 오버라이딩으로는 도저히 구현되지 않는 경우에 다운캐스팅 사용

Comments