Java에서 하나의 데이터 타입을 다른 타입으로 바꾸는 것을 'Casting(형변환)' 이라고 한다. 주로 primitive 타입과 reference 타입에서 값을 대입하거나 연산을 위해 캐스팅이 발생한다.
업캐스팅 & 다운캐스팅
상속 관계에 있는 부모 클래스(Super Class)와 자식 클래스(Sub Class)간에도 캐스팅이 가능하다. 부모 클래스를 자식 클래스로 캐스팅 하는것을 DownCasting, 자식 클래스를 부모 클래스로 캐스팅 하는것을 UpCasting이라 한다. (단, 형제 클래스 끼리는 캐스팅이 불가능)
업캐스팅(UpCasting)
- 자식 클래스를 부모 클래스로 캐스팅 하는 것
- 캐스팅 연산자 괄호를 생략할 수 있다
ex) 아래의 두 방법 모두 사용 가능
Parent p = (Parent) new Child();
Parent p = new Child(); - 부모 클래스로 캐스팅 되므로, '자식 클래스에만' 있는 속성과 메서드는 실행하지 못한다
- 만약 자식 클래스에서 오버라이딩한 부모 클래스의 메서드가 있다면,
오버라이딩 특성상 런타임 환경에서 동적으로 바인딩 되기에 부모 클래스가 아닌 자식 클래스의 메서드가 실행된다
다운캐스팅(DownCasting)
- 부모 클래스를 자식 클래스로 캐스팅 하는 것
- 캐스팅 연산자 괄호를 생략할 수 없다. 꼭 필요!
- 다운캐스팅은 업캐스팅한 자식 클래스를, 다운캐스팅을 통해 다시 자식 클래스로 되돌려 본래의 필드와 메서드를 복구하는데 목적을 둔다
- 따라서 그냥 부모 클래스가 아니라, 업캐스팅한 객체만 다운캐스팅을 할 수 있다
public class CastingTest {
// 부모 클래스
public static class Parent {
int parentAge = 30;
public String name() {
return "Parent";
}
}
// 자식 클래스
public static class Child extends Parent {
int childAge = 10;
@Override
public String name() {
return "Child";
}
}
// 형변환 테스트
public static void main(String[] args) {
Parent upCastingChild = new Child(); // 업캐스팅, 캐스팅 연산자 필요 없음
Child downCastingParent = (Child) upCastingChild; // 다운캐스팅, 캐스팅 연산자 필요, 복구시키는데 목적이 있음
//System.out.println(upCastingChild.childAge); // 컴파일 에러, 부모 클래스로 형변환 했기 때문에 childAge가 없음
System.out.println("다운캐스팅 결과, Age: " + downCastingParent.parentAge); // 가능, 부모 클래스로부터 상속받은 필드
System.out.println("업캐스팅 결과, name: " + upCastingChild.name()); // Child의 오버라이딩된 메소드 호출
System.out.println("다운캐스팅 결과, name: " + downCastingParent.name()); // Child의 오버라이딩된 메소드 호출
}
}
Reference
- Casting(업캐스팅 & 다운캐스팅) : https://gyoogle.dev/blog/computer-language/Java/Casting.html
- 업캐스팅 다운캐스팅 한방 이해하기 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85-%EB%8B%A4%EC%9A%B4%EC%BA%90%EC%8A%A4%ED%8C%85-%ED%95%9C%EB%B0%A9-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0