728x90
반응형
SMALL
다운 캐스팅
- 업 캐스팅된 클래스를 다시 원래의 타입으로 형 변환입니다.
- 하위 클래스로의 형 변환은 명시적으로 해야 합니다.
Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; // 명시적
instanceof를 이용하여 인스턴스의 형 체크
- 원래의 인스턴스의 형이 맞는지 여부를 체크하는 키워드입니다.
- 맞으면 true 아니면 false를 반환합니다.
AnimalTest.java
import java.util.ArrayList;
class Animal {
// 공통적으로 사용하는 메서드는 상위 클래스에 선언합니다.
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal {
@Override
public void move() {
System.out.println("사람이 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽습니다.");
}
}
class Tiger extends Animal {
@Override
public void move() {
System.out.println("호랑이가 네발로 뜁니다.");
}
public void hunting() {
System.out.println("호랑이가 사냥을 합니다.");
}
}
class Eagle extends Animal {
@Override
public void move() {
System.out.println("독수리가 하늘을 날아 다닙니다.");
}
public void flying() {
System.out.println("독수리가 양날개를 쭉 펴고 날아 다닙니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal h = new Human();
Animal t = new Tiger();
Animal e = new Eagle();
AnimalTest test = new AnimalTest();
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(h);
animalList.add(e);
animalList.add(t);
for (Animal animal : animalList) {
animal.move();
}
test.testDownCasting(animalList);
}
public void testDownCasting(ArrayList<Animal> list) {
for(int i = 0; i< list.size(); i++) {
Animal animal = list.get(i);
if(animal instanceof Human) {
Human human = (Human)animal;
human.readBook();
}
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("X");
}
}
}
public void moveAnimal(Animal animal) {
animal.move();
}
}
출력 결과
사람이 걷습니다.
독수리가 하늘을 날아 다닙니다.
호랑이가 네발로 뜁니다.
사람이 책을 읽습니다.
독수리가 양날개를 쭉 펴고 날아 다닙니다.
호랑이가 사냥을 합니다.
- 다운 캐스팅을 사용하면 코드가 많이 지저분해지고 각 타입으로 다시 되돌려야 하는 경우가 많이 있습니다.
- 다형성을 사용하는 방법이 더 좋지만 반드시 원래 타입으로 되돌여야 하는 경우는 instanceof를 사용하여 확인한 다음에 하면 됩니다.
728x90
반응형
LIST
'Java' 카테고리의 다른 글
[JAVA] 자바 - 추상 클래스의 응용 (템플릿 메서드 패턴) (0) | 2021.12.01 |
---|---|
[JAVA] 자바 - 추상 클래스란? (0) | 2021.12.01 |
[JAVA] 자바 - IS-A 관계, HSA-A 관계 (0) | 2021.11.30 |
[JAVA] 자바 - 다형성을 활용한 멤버쉽 프로그램 확장 (0) | 2021.11.30 |
[JAVA] 자바 - 다형성과 다형성을 사용하는 이유 (0) | 2021.11.30 |
댓글