package ch04_casting;

public class Base {
	
	private String item;
	
	public Base() {
		item = "기본 무기";
	}
	
	public void baseAttack() {
		System.out.println(item + " 사용");
	}
}
--------------------------------------------------------------------------------

//UnitA
package ch04_casting;

public class UnitA extends Base{
	
	private String unitItem;
	
	public UnitA() {
		unitItem = "방어막";
	}
	
	public void unitAttack() {
		System.out.println(unitItem + " 사용");
	}
}
--------------------------------------------------------------------------------

//UnitB
package ch04_casting;

public class UnitB {

}
--------------------------------------------------------------------------------

//CastingTest
package ch04_casting;

/*
 * instanceof 연산자
 * → 참조 변수가 현재 사용중인 객체 타입을 확인할 때 사용.
 * 	 타입 같으면 true, 다르면 false 입니다.
 */
public class CastingTest {

	public static void main(String[] args) {
		
		// 먼저 부모타입인 Base의 영역이 만들어지고, 자식타입인 UnitA의 영역이 만들어짐.
		UnitA userA = new UnitA();
		userA.baseAttack();
		userA.unitAttack();
		System.out.println();
		
		Base base = userA; // UP casting : 자식의 객체를 부모에게 넘기는 현상.
		base.baseAttack();
		// base.unitAttack(); Error ! why? 객체를 사용중인 참조변수가 중요 ! 참조변수 보고 타입을 확인하기 때문에..
		
		System.out.println();
		
		userA = (UnitA) base; // DOWN casting : 자료의 형변환으로 인식하여, 변환 타입 지정.
		userA.unitAttack();
		userA.baseAttack();
		
		System.out.println();
		
		// base변수가 사용하고 있는 객체 타입이 UnitA이 사용하고 있는것과 맞은지 확인하는 함수. 참: true , 거짓 : false
		// unitB의 존재가능성 때문에 한 번 체크하고 넘김.
		if (base instanceof UnitA) {
			userA = (UnitA)base;
		}

	}

}