부모(넓은) 클래스가 자식(작은) 클래스를 가리키고 있는 상황에서, 부모클래스 형태의 인스턴스가 자식 인스턴스까지 참조하고자 할 때 이루어지는 과정을 형 변환이라 한다.
아래 부모 클래스와 자식 클래스와 함께 각각 run과 alert 메소드가 있다고 가정해보자.
public class Car{
public void run(){
}
}
public class Truck extends Car{
public void alter(){
}
}
이때 위 메소드를 사용하기에 앞서, 부모가 자식을 가르키는 형태로, 즉 부모 타입으로 참조변수를 만들어 자식 인스턴스를 참조하도록 만들 수 있다.
public class busTest{
public void main(String[] args){
Car c = new Bus(); //형태는 부모 클래스, 참조 인스턴스는 자식 클래스
}
}
이때 만들어진 참조변수 c는 일단은 부모클래스의 메소드만 사용할 수 있다.
c.run(); //가능
c.alert(); //불가능
이 경우에 바로 클래스 형 변환을 사용하여 자식 클래스의 메소드까지 사용할 수 있다.
형 변환은 기본적으로 큰 그릇을 담고 있는 변수를 다시 작은 그릇을 가르키도록 옮겨주는 작업이다.
위에서 일단 클래스 형변환이 한 번 발생하였다.
Car c = new Bus();
형태는 부모 클래스이지만, 자식 인스턴스를 참조하기 때문이다.
이때 자식 클래스의 메소드까지 사용하기 위한 실질적인 형변환은 자료형 형변환하듯이 소괄호()를 활용해주면 된다.
기본 자료형 형변환
long value1 = value;
int result = (int)value1;
클래스 형변환
Car c = new Bus();
Bus bus = (Bus) c;
※ 부모 클래스 형태를 가지면서 자식 인스턴스를 가르키는 변수(=실질적으로 사용하는 인스턴스)를 다시 자식 클래스로 향하도록 변환해주는데, 이때 새로 생성하는 참조변수는 형태가 자식클래스 형태이다.
위와 같은 형 변환이 일어난다면, 해당 참조변수는 자식 클래스의 메소드까지 사용가능하며, 물론 부모 클래스의 메소드까지도 사용가능하다.
bus.run();
bus.alert();