JAVA Programming

[37] 다운캐스팅 과 instanceof

꾸준히개발하자 2020. 7. 16. 06:15

다운 캐스팅과 instanceof

하위클래스에서 상위클래스로 업캐스팅 묵시적으로 형변환 된다.

다시 원래되로 돌아오는게 다운캐스팅 이라 부른다

반환타입이 상위클래스 경우 자기 형으로 돌아와야 모든 메소드를 사용할수있으니까

 

하위 클래스로 형변환 , 다운 캐스팅

묵시적으로 상위 클래스 형변환된 인스턴스가 원래 자료형(하위클래스)으로 변환되어야 할 때 다운 캐스팅 이라 한다.

하위 클래스로의 형변환은 명시적으로 되어야 한다.

Customer vc = new VIPCustomer(); // 묵시적 형변환

VIPCustomer vCustomer = (VIPCustomer) vc;  // 명시적 형변환

명시적으로 VIPCustomer 이라고 알려줘야 한다 이것이 명시적 형변환

명시적 형변환 

Customer vc = new VIPCustomer();

VIPCustomer vc2 = (VIPCustomer) vc;

package polymorphism;

import java.util.ArrayList;

class Animal3 {
	public void move() {
		System.out.println("동물이 걷습니다.");
	}
	public void eating() {	
	}
}
class Tiger3 extends Animal3 {
	@Override
	public void move() {
		System.out.println("네 발로 걷습니다.");
	}
	
	public void hunting() {
		System.out.println("발톱으로 사냥을 합니다.");
	}
}
class Eagle3 extends Animal3 {
	@Override
	public void move() {
		System.out.println("날아다닙니다.");
	}
	
	public void hunting() {
		System.out.println("날아다니며 사냥합니다.");
	}
}
class Human3 extends Animal3 {
	@Override
	public void move() {
		System.out.println("두발로 걷습니다.");
	}
}
public class AnimalTest3 {
	public static void main(String[] args) {
		Animal3 t = new Tiger3(); // 업캐스팅 묵시적 
		Animal3 e = new Eagle3();
		Animal3 h = new Human3();
		
		Tiger3 t2 = (Tiger3) t; // 명시적 다운캐스팅 
		Eagle3 e2 = (Eagle3) e;
		Human3 h2 = (Human3) h;
		
		t2.hunting(); // 
		e2.hunting();
		
		
		System.out.println("=================================================");
		ArrayList<Animal3> animal3 = new ArrayList<Animal3>();
		animal3.add(t);
		animal3.add(e);
		animal3.add(h);
		
		AnimalTest3 test = new AnimalTest3();
		test.testDownCasting(animal3);
		/*
		for(Animal3 animal : animal3) { // 클래스명 객체 : 배열객체명
			animal.move();
		}*/
		System.out.println("====================================================");
	}
		public void moveAnimal3 (Animal3 animal4) {
			animal4.move();
			System.out.println("===================================================");
	}	
		public void testDownCasting(ArrayList<Animal3> list2) {
			for(int i = 0; i < list2.size(); i++) {
				Animal3 animal3 = list2.get(i);
				
				// 다운캐스팅이 불릴것이다.  명시적으로 불러야 한다. 
				if(animal3 instanceof Human3) {
					Human3 human = (Human3) animal3;
				} else if (animal3 instanceof Tiger3) {
					Tiger3 tiger = (Tiger3) animal3;
					tiger.hunting();
				} else if (animal3 instanceof Eagle3) {
					Eagle3 eagle = (Eagle3) animal3;
					eagle.hunting();
				} 
			}
		}
}