공부 기록장
Java 업캐스팅과 다운캐스팅, instanceof 본문
하나의 데이터 타입을 다른 데이터 타입으로 바꾸는 것을 타입 변환 혹은 형 변환(캐스팅)이라고 한다.
상속 관계의 클래스는 부모 클래스와 자식 클래스로 구분할 수 있는데,
기본형 타입끼리의 형 변환이 가능하듯, 자바에서 상속 관계에 있는 부모-자식 클래스 간에도 서로 형 변환이 가능하다.
같은 부모 클래스를 상속받고 있더라도 형제 클래스끼리는 타입이 다르기 때문에 참조 형 변환이 불가능하다.
예를 들어 Cat 클래스와 Dog 클래스가 둘 다 Animal 클래스를 상속받은 자식 클래스일 때,
Cat과 Dog 사이의 형 변환은 불가하다.
[업 캐스팅, UpCasting]
자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것
- 객체를 업캐스팅 하게 되면, 자식과 부모의 공통된 것만 사용할 수 있고, 자식 클래스에서 새로 만들어진 것은 사용할 수 없다.
- 업 캐스팅이 되었더라도, 오버라이딩 된 메서드는 자식 클래스의 메서드로 실행된다.
업 캐스팅과 다운 캐스팅을 사용하는 이유
공통적으로 할 수 있는 부분을 만들어서, 상속 관계에서 상속 받은 서브 클래스가 몇 개이든 하나의 인스턴스로 묶어서 간단하게 관리하기 위해서이다.
하나의 자료형으로 관리하면, 코드량도 줄고 가독성과 유지보수성은 좋아진다.
하지만!
아까 위에서 언급했듯, 오버라이딩 한 메서드가 아닌 이상 업캐스팅한 부모 클래스 타입에서 자식 클래스의 고유한 메소드 실행은 불가하다.
자식 클래스의 고유한 메소드를 실행하기 위해, 업 캐스팅한 객체를 다시 자식 클래스 타입으로 되돌리는 다운 캐스팅이 필요하다.
[다운 캐스팅, DownCasting]
부모 클래스로 업 캐스팅된 자식 클래스를 복구하여, 본인의 필드와 원래 있던 기능을 회복하기 위해 부모 클래스를 자식 클래스 타입으로 캐스팅하는 것
- 다운 캐스팅을 다룰 때에는 다운 캐스팅 할 객체의 본래 타입이 오리지날 부모 객체인지, 자식 객체에서 업 캐스팅된 부모 객체인지 생각해봐야 한다.
- 오리지날 부모 객체를 다운 캐스팅할 경우 ClassCastException이 발생하다.
instanceof 연산자
업 캐스팅과 다운 캐스팅 유무를 확인하여 참조 캐스팅 동작을 결정하는데 도움을 받을 수 있다.
// instanceof 사용 예시
class Unit{}
class Zealot extends Unit{}
// Zealot은 Unit을 상속하는 클래스
// Zealot은 자식 클래스, Unit은 부모 클래스
public class Main{
public static void main(String[] args) {
Unit unit = new Unit();
Unit unit2 = new Zealot();
if (unit instanceof Zealot) {
System.out.println("다운캐스팅 가능");
} else {
System.out.println("다운캐스팅 불가능"); // 실행
}
if (unit2 instanceof Zealot) {
System.out.println("다운캐스팅 가능"); // 실행
Zealot z = (Zealot) unit2; // 다운캐스팅
} else {
System.out.println("다운캐스팅 불가능");
}
}
}