반응형
다운 캐스팅(downcasting)
- 업캐스팅된 클래스를 다시 원래의 타입으로 형 변환
- 하위 클래스로의 형 변환은 명시적으로 해야 함
Customer vc = new VIPCustomer(); // 묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; // 명시적
instanceof를 이용하여 인스턴스의 형 체크
원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드
맞으면 true, 아니면 false를 반환함
package ch29;
import java.util.ArrayList;
import java.util.Iterator;
class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
public void eating() {
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 hAnimal = new Human();
Animal tAnimal = new Tiger();
Animal eAnimal = new Eagle();
AnimalTest test = new AnimalTest();
// test.moveAnimal(hAnimal);
// test.moveAnimal(tAnimal);
// test.moveAnimal(eAnimal);
ArrayList<Animal> animalList = new ArrayList<>();
animalList.add(hAnimal);
animalList.add(tAnimal);
animalList.add(eAnimal);
for (Animal animal : animalList) {
animal.move();
}
System.out.println("==================");
test.testDown(animalList);
}
public void moveAnimal(Animal animal) {
animal.move();
animal.eating();
}
public void testDown(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("아무것도 아니다");
}
}
}
}
반응형
'언어 > JAVA' 카테고리의 다른 글
추상 클래스 응용 - 템플릿 메서드 패턴 (0) | 2021.04.18 |
---|---|
추상 클래스(abstract class) 구현 (0) | 2021.04.18 |
상속을 사용하면 좋은 경우 (0) | 2021.04.18 |
다형성과 다형성을 사용하는 이유 (0) | 2021.04.18 |
메서드 재정의, 가상 메서드 원리 (0) | 2021.04.18 |