본문 바로가기
java

Java -3강 다형성, instanceof, 다운캐스팅

by 킹차니 2021. 2. 21.

2강에서 이해한 가상메서드와 묵시적 형 변환을 바탕으로 다형성을 이해해보자.

 

다형성이란?
하나의 코드가 여러 자료형으로 구현되어 실행되는 것. 즉, 코드에서 여러 실행 결과가 나오는 것이다.

 

최상위 클래스로 Animal클래스가 있고, 이를 상속받는 Human, Tiger, Eagle클래스 가 있는 경우를 생각해보자.

package polymorphism;
import java.util.ArrayList;

class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}
class Human extends Animal{
	public void move() {
		System.out.println("사람이 두 발로 걷습니다.");
	}
	public void readBook() {
		System.out.println("사람이 책을 읽는다.");
	}
}

class Tiger extends Animal{
	public void move(){
		System.out.println("호랑이가 네 발로 뜁니다.");
	}
	public void hunting() {
		System.out.println("사자가 사냥을 한다.");
	}
}

class Eagle extends Animal{
	public void move() {
		System.out.println("독수리가 하늘을 납니다.");
	}
	public void fiying() {
		System.out.println("독수리가 멀리멀리 날아간다.");
	}
}
public class AnimalTest {
	ArrayList<Animal> aniList = new ArrayList<Animal>();
	public static void main(String[] args) {
		AnimalTest aTest = new AnimalTest();
		aTest.addAnimal();
		System.out.println("원래 형으로 다운 캐스팅");
		aTest.testCasting();
	}
	public void addAnimal() {
		aniList.add(new Human());
		aniList.add(new Tiger());
		aniList.add(new Eagle());
		
		for(Animal ani: aniList) { // 묵시적 형 변환이 일어난다. 하지만 move메서드는 각 인스턴스 형에 의해 호출된다.
			ani.move();
		}
	}
	public void testCasting() {
		for(int i=0; i <aniList.size(); i++) {
			Animal ani = aniList.get(i); // Animal형으로 가져온
			if(ani instanceof Human) {   // Human이면
				Human h = (Human)ani;    //  Human형으로 다운캐스팅
				h.readBook();
			}
			else if(ani instanceof Tiger){ // Tiger이면
				Tiger h = (Tiger)ani;	   // Tiger형으로 다운캐스팅
				h.hunting();
			}
			else{                          // Eagle이면
				Eagle h = (Eagle)ani;      // Eagle형으로 다운캐스팅
				h.fiying();
			}
		}
	}
}

출력결과:

사람이 두 발로 걷습니다.

호랑이가 네 발로 뜁니다.

독수리가 하늘을 납니다.

원래 형으로 다운 캐스팅

사람이 책을 읽는다.

사자가 사냥을 한다.

독수리가 멀리멀리 날아간다.

 

가상메서드와 묵시적 형 변환을 사용하여 

for(Animal ani: aniList) {

        ani.move();

}

의 비교적 간단한 코드로 모두 다른 수행 결과를 출력하였다.

 

위의 예시 코드에서 instanof가 나오는데 이는 다운 캐스팅을 위한 예약어이다. 위의 다운 캐스팅 부분을 자세히 봐보자.

Animal ani = new Human();
if(ani instanceof Human){
	// ani인스턴스 원래 형이 Human일 경우
}
else{
    // 아닐 경우
}

위에서 ani의 원래 형은 Human이었다. a instanceof A 를 사용하여 a가 A의 인스턴스 형인지 알아낼수 있다. 

만약 ani가 Human의 인스턴스형이 참이라면 이를 대상으로 원래의 형으로 다운캐스팅할 수 있다.