2강에서 이해한 가상메서드와 묵시적 형 변환을 바탕으로 다형성을 이해해보자.
다형성이란?
하나의 코드가 여러 자료형으로 구현되어 실행되는 것. 즉, 코드에서 여러 실행 결과가 나오는 것이다.
최상위 클래스로 Animal클래스가 있고, 이를 상속받는 Human, Tiger, Eagle클래스 가 있는 경우를 생각해보자.
package polymorphism;
import java.util.ArrayList;
class Animal{
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
public void move() {
System.out.println("사람이 두 발로 걷습니다.");
}
public void readBook() {
System.out.println("사람이 책을 읽는다.");
}
}
class Tiger extends Animal{
public void move(){
System.out.println("호랑이가 네 발로 뜁니다.");
}
public void hunting() {
System.out.println("사자가 사냥을 한다.");
}
}
class Eagle extends Animal{
public void move() {
System.out.println("독수리가 하늘을 납니다.");
}
public void fiying() {
System.out.println("독수리가 멀리멀리 날아간다.");
}
}
public class AnimalTest {
ArrayList<Animal> aniList = new ArrayList<Animal>();
public static void main(String[] args) {
AnimalTest aTest = new AnimalTest();
aTest.addAnimal();
System.out.println("원래 형으로 다운 캐스팅");
aTest.testCasting();
}
public void addAnimal() {
aniList.add(new Human());
aniList.add(new Tiger());
aniList.add(new Eagle());
for(Animal ani: aniList) { // 묵시적 형 변환이 일어난다. 하지만 move메서드는 각 인스턴스 형에 의해 호출된다.
ani.move();
}
}
public void testCasting() {
for(int i=0; i <aniList.size(); i++) {
Animal ani = aniList.get(i); // Animal형으로 가져온
if(ani instanceof Human) { // Human이면
Human h = (Human)ani; // Human형으로 다운캐스팅
h.readBook();
}
else if(ani instanceof Tiger){ // Tiger이면
Tiger h = (Tiger)ani; // Tiger형으로 다운캐스팅
h.hunting();
}
else{ // Eagle이면
Eagle h = (Eagle)ani; // Eagle형으로 다운캐스팅
h.fiying();
}
}
}
}
출력결과:
사람이 두 발로 걷습니다.
호랑이가 네 발로 뜁니다.
독수리가 하늘을 납니다.
원래 형으로 다운 캐스팅
사람이 책을 읽는다.
사자가 사냥을 한다.
독수리가 멀리멀리 날아간다.
가상메서드와 묵시적 형 변환을 사용하여
for(Animal ani: aniList) {
ani.move();
}
의 비교적 간단한 코드로 모두 다른 수행 결과를 출력하였다.
위의 예시 코드에서 instanof가 나오는데 이는 다운 캐스팅을 위한 예약어이다. 위의 다운 캐스팅 부분을 자세히 봐보자.
Animal ani = new Human();
if(ani instanceof Human){
// ani인스턴스 원래 형이 Human일 경우
}
else{
// 아닐 경우
}
위에서 ani의 원래 형은 Human이었다. a instanceof A 를 사용하여 a가 A의 인스턴스 형인지 알아낼수 있다.
만약 ani가 Human의 인스턴스형이 참이라면 이를 대상으로 원래의 형으로 다운캐스팅할 수 있다.
'java' 카테고리의 다른 글
인터페이스 - 느슨한 결합력 (0) | 2021.04.25 |
---|---|
자바의 다형성 (0) | 2021.03.25 |
Java - 4강 추상 클래스, 템플릿 메서드, final예약어 (0) | 2021.02.21 |
Java - 2강 상속, 묵시적 클래스 형 변환, 가상 메서드 (0) | 2021.02.21 |
Java-1강 상속 (0) | 2021.02.21 |