다운 캐스팅 & instanceof

일상 코딩·2022년 8월 11일
post-thumbnail

01.다운 캐스팅(downcasting)

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

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

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

testDownCasting.java

package ch08;

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) {
		
		AnimalTest test = new AnimalTest();
		// UpCasting
		Animal hAnimal = new Human();
		Animal tAnimal = new Tiger();
		Animal eAnimal = new Eagle();		
		
		ArrayList<Animal> animalList = new ArrayList<>();
		animalList.add(hAnimal);
		animalList.add(tAnimal);
		animalList.add(eAnimal);

		for(Animal animal : animalList) {
			animal.move();
		}
		
		System.out.println();
		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; // DownCasting
				human.readBook();
			}
			
			else if(animal instanceof Tiger) {
				Tiger tiger = (Tiger)animal; // DownCasting
				tiger.hunting();
			}

			else if(animal instanceof Eagle) {
				Eagle eagle = (Eagle)animal; // DownCasting
				eagle.flying();
			}
			
			else {
				System.out.println("unsupported type");
			}
		}
	}
	
	public void moveAnimal (Animal animal) { 
		animal.move();
	}
}

출력 결과

profile
일취월장(日就月將) - 「날마다 달마다 성장하고 발전한다.」

0개의 댓글