캐스팅이란 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환(캐스팅)이라고 한다.
자바의 데이터형을 알아보면 크게 두가지로 나뉜다.
1. 기본형(primitive type) -> Boolean Type(boolean) -> Numberic Type(short,int,long,float,double,char)
2. 참조형(reference Type) -> Class Type -> Interface Type-> Array Type -> Enum Type -> 그 외 다른 것들
자바의 상속관계(extends, implements)에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능하다.
자바 클래스의 객체는 부모 클래스를 상속하고 있기때문에 부모의 멤버를 모두 가지고 있다.
반면, 부모 클래스의 객체는 자식 클래스의 멤버를 모두 가지고 있지 않는다.
즉, 참조변수의 형변환은 사용할 수 있는 멤버의 개수를 조절하는 것이다.
출력 예시
class Parent {
String name;
int age;
}
//Parent(부모)클래스를 Child클래스로 상속 받는다.
class Child extends Parent {
int number;
}
//객체 생성
Parent p = new Parent();
Child c = new Child();
Parent p2 = (Parent) c; //업캐스팅-자식에서 부모로
Child c2 = (Child) p; //다운캐스팅-부모에서 자식으로
업캐스팅을 사용하는 이유는 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서 이다.
출력 예시
class Unit {
public void attak() {
System.out.println("유닛 공격");
}
}
class Zealot extends Unit {
@Overrid
public void attack() {
System.out.println("찌르기")
}
public void teleportation() {
System.out.println("프로토스 워프");
}
}
public class Main {
public static void main(String[] args) {
//변수 생성
Unit unit_up;
//Zealot 객체 생성
Zealot zealot = new Zealot();
//업캐스팅
unit_up = zealot;
//다운캐스팅 : 자식 전용 멤버를 이용하기 위해 , 이미 업캐스팅한 객체를 되돌릴때 사용
Zealot unit_down = (Zealot) unit_up;
unit_down.attack();
unit_down.teleportation();
}
}
설명 : 업캐스팅된 객체 unit_up에서 만일 자식 클래스에만 있는 teleportation()메서드를 실행해야 하는 상황이 온다면, 다운 캐스팅을 통해 자식 클래스 타입으로 회귀 시킨뒤 메서드를 실행하면 된다.