공부 기록장

Java 업캐스팅과 다운캐스팅, instanceof 본문

언어/Java

Java 업캐스팅과 다운캐스팅, instanceof

빛나무 2023. 10. 29. 16:05

하나의 데이터 타입을 다른 데이터 타입으로 바꾸는 것을 타입 변환 혹은 형 변환(캐스팅)이라고 한다.

 

상속 관계의 클래스는 부모 클래스와 자식 클래스로 구분할 수 있는데,

기본형 타입끼리의 형 변환이 가능하듯, 자바에서 상속 관계에 있는 부모-자식 클래스 간에도 서로 형 변환이 가능하다.

 

같은 부모 클래스를 상속받고 있더라도 형제 클래스끼리는 타입이 다르기 때문에 참조 형 변환이 불가능하다.

예를 들어 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("다운캐스팅 불가능");
        }
    }
}