다운 캐스팅과 instanceof

상속 관계에서 하위 클래스에서 상위 클래스로 형변환 하는 것을 업 캐스팅이라고 한다. 그리고 반대로 다시 상위 클래스에서 하위 클래스, 원래 클래스로 되돌아 오는 것을 다운 캐스팅이라고 한다. 하지만 업 캐스팅과는 다르게 다운 캐스팅의 경우 자동으로 일어나지 않으므로 명시적으로 작성해야 한다.

 

1. 다운 캐스팅

업 캐스팅을 할 경우, 실제 인스턴스가 갖고 있는 멤버 변수들을 다 사용하지 못할 수 있다. 따라서 실제 인스턴스가 갖고 있는 멤버 변수나 메서드를 사용해야 하는 경우 다시 원래 타입으로 되돌아가야 하는 상황이 발생할 수 있다. 이 때 사용하는 것이 다운 캐스팅으로 자동으로 일어나지 않는다.

Customer vc = new VIPCustomer();              //묵시적
VIPCustomer vCustomer = (VIPCustomer)vc;      //명시적

Customer(상위) <- VIPCustomer(하위) 일 때, 다운 캐스팅을 할 경우 명시적 형변환이 필요하다.

 

2. 자신의 근본을 찾는 방법, instanceof

하나의 상위 클래스에서 여러 개의 하위 클래스가 나뉘어 질 수 있다. 즉, 업 캐스팅 시에는 여러 개의 하위 클래스가 하나의 상위 클래스로 변환되기 때문에 상관이 없다. 하지만 다운 캐스팅의 경우 하나의 상위 클래스에서 변환될 수 있는 하위 클래스가 다양할 수 있다. 따라서 자신의 원래 클래스 타입으로 되돌아가기 위해서는 적절한 검증이 필요하다. 이 때 사용하는 것이 instanceof 이다. 

    if ( animal instanceof Human) {
        Human human = (Human)animal;
        human.readBooks();
    }
    else if( animal instanceof Tiger) {
        Tiger tiger = (Tiger)animal;
        tiger.hunting();
    }
    else if( animal instanceof Eagle) {
        Eagle eagle = (Eagle)animal;
        eagle.flying();
    }
    else {
        System.out.println("error");
    }
}

animal이라는 변수는 Animal 타입으로 Human, Tiger, Eagle의 상위 클래스이다. 즉, Animal 타입인 animal이 다운 캐스팅할 수 있는 타입의 개수는 3개이다. 이 때 자신의 원래 클래스 타입을 확인하기 위해서 "캐스팅 변수 instanceof 변환 클래스" 로 조건문을 작성한다. 이 때 instanceof의 반환타입은 boolean으로 만약 다운 캐스팅하고자 하는 클래스가 자신의 원래 인스턴스 타입과 일치한다면 true를 반환할 것이다. 위 코드의 경우, Human, Tiger, Eagle 각각이 갖고 있는 고유의 메서드가 있으며, 이를 실행하기 위해서 다운 캐스팅을 하는 것이다.

 

자료 출처 : https://fastcampus.co.kr/dev_online_javaend

 

한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online. | 패스트캠퍼스

Java/Spring 웹 개발, 핵심 25가지 스킬부터 공부하세요. 대기업 출신 7인의 강사진이 모여 만든 Java/Spring 웹 개발 완전체 커리큘럼! 핵심 스킬 25가지 강의부터 250개의 예제, 7개의 프로젝트까지! 비

fastcampus.co.kr