본문 바로가기
Java

[JAVA] 자바 - 다운 캐스팅과 instanceof

by Seong-Jun 2021. 11. 30.
728x90
반응형
SMALL

다운 캐스팅

  • 업 캐스팅된 클래스를 다시 원래의 타입으로 형 변환입니다.
  • 하위 클래스로의 형 변환은 명시적으로 해야 합니다.
Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; // 명시적

 

instanceof를 이용하여 인스턴스의 형 체크

  • 원래의 인스턴스의 형이 맞는지 여부를 체크하는 키워드입니다.
  • 맞으면 true 아니면 false를 반환합니다.

 

AnimalTest.java

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 readBook() {
      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 h = new Human();
      Animal t = new Tiger();
      Animal e = new Eagle();
      
      AnimalTest test = new AnimalTest();
      
      ArrayList<Animal> animalList = new ArrayList<>();
      animalList.add(h);
      animalList.add(e);
      animalList.add(t);
      
      for (Animal animal : animalList) {
         animal.move();
      }
      
      test.testDownCasting(animalList);
      
   }
   
   public void testDownCasting(ArrayList<Animal> list) {
      for(int i = 0; i< list.size(); i++) {
         Animal animal = list.get(i);
         
         if(animal instanceof Human) {
            Human human = (Human)animal;
            human.readBook();
         }
         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("X");
         }
      }
   }
   
   public void moveAnimal(Animal animal) {
      animal.move();
   }
}

 

출력 결과

사람이 걷습니다.
독수리가 하늘을 날아 다닙니다.
호랑이가 네발로 뜁니다.
사람이 책을 읽습니다.
독수리가 양날개를 쭉 펴고 날아 다닙니다.
호랑이가 사냥을 합니다.
  • 다운 캐스팅을 사용하면 코드가 많이 지저분해지고 각 타입으로 다시 되돌려야 하는 경우가 많이 있습니다.
  • 다형성을 사용하는 방법이 더 좋지만 반드시 원래 타입으로 되돌여야 하는 경우는 instanceof를 사용하여 확인한 다음에 하면 됩니다.

 

 

728x90
반응형
LIST

댓글