클래스는 객체의 멤버 변수와 메소드를 정의해 놓은 것이고 인스턴스는 클래스가 실제 메모리에 생성된 상태이다.

 

자바의 다형성에서 상위클래스의 참조변수로 하위클래스의 인스턴스를 사용할 수 있다고 했다.

 

이렇게 다형성을 사용하면 하나의 클래스 참조변수가 어떤 클래스의 인스턴스인지 확인할 방법이 필요하다.

 

instanceof 키워드로 확인할 수 있다. 8-4 포스트에 있는 소스코드에서 약간의 코드를 추가했다.

 

인스턴스 instanceof 클래스;

 

인스턴스를 가리키는 참조변수가 클래스의 인스턴스면 true를 반환한다. human1은 상위클래스의 참조변수이다. human1은 Fighter 클래스의 메소드인 defense를 사용할 수 없다. 하위클래스로의 형변환이 필요하다.

		boolean itest = human1 instanceof Fighter;
		System.out.println(itest);  // 인스턴스 확인 true or false

import java.util.ArrayList;

public class OOPTest3 {
	public static void main(String[] args) {
		
		ArrayList<Human> hl1 = new ArrayList<Human>();
		
		Human human1 = new Fighter();
		Human human2 = new Wizard();
		Human human3 = new Knight();
		Human human4 = new Monk();
		
            // 인스턴스 확인하기
		boolean itest = human1 instanceof Fighter;
		System.out.println(itest);            
        
		hl1.add(human1);
		hl1.add(human2);
		hl1.add(human3);
		hl1.add(human4);
		
		System.out.println("==== Class Test ====");
		for (Human hm1 : hl1) {
			hm1.attack();
		}		
		System.out.println("---------------------------------");
		System.out.println("あなたのことが好きだと叫びたい!");
		System.out.println("=================================");
	}
}
class Human{
	public void attack() {
		System.out.println("Human's attack!");
	}
}
class Fighter extends Human{
	public void attack() {
		System.out.println("Fighter's axe attack!");
	}
    public void defesne(){
    	System.out.println("Fighter's defense!");
    }
}
class Wizard extends Human{
	public void attack() {
		System.out.println("Wizard's magic missile attack!");
	}
}
class Knight extends Human{
	public void attack() {
		System.out.println("Knight's sword attack!");
	}
}
class Monk extends Human{
	public void attack() {
		System.out.println("Monk's jump kick attack!");
	}
}

다운캐스팅은 아래와 같이 한다. 먼저 인스턴스인지 확인을 한 후 Fighter형 참조변수에 대입한다. 이제 Human 의 인스턴스는 사용못했던 Fighter의 메소드인 defense( )를 사용할 수 있다. 

		if(human1 instanceof Fighter) {
			Fighter ft1 = (Fighter)human1; // 다운캐스팅 형변환(명시적)
			ft1.defense();
		}

 

공유하기

facebook twitter kakaoTalk kakaostory naver band