클래스는 객체의 멤버 변수와 메소드를 정의해 놓은 것이고 인스턴스는 클래스가 실제 메모리에 생성된 상태이다.
자바의 다형성에서 상위클래스의 참조변수로 하위클래스의 인스턴스를 사용할 수 있다고 했다.
이렇게 다형성을 사용하면 하나의 클래스 참조변수가 어떤 클래스의 인스턴스인지 확인할 방법이 필요하다.
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();
}