상속 관계에서 하위 클래스에서 상위 클래스로 형변환 하는 것을 업 캐스팅이라고 한다. 그리고 반대로 다시 상위 클래스에서 하위 클래스, 원래 클래스로 되돌아 오는 것을 다운 캐스팅이라고 한다. 하지만 업 캐스팅과는 다르게 다운 캐스팅의 경우 자동으로 일어나지 않으므로 명시적으로 작성해야 한다.
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
'Java > JAVA 문법 정리' 카테고리의 다른 글
println()으로 null인 객체를 호출할 때, 예외가 발생하지 않는 이유 (1) | 2024.03.31 |
---|---|
하위 클래스의 생성과정과 형변환 (0) | 2022.10.25 |
싱글톤 패턴 (0) | 2022.10.23 |