다형성이란, 객체지향의 중요한 특성으로, 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 말한다.
예를들어 Human
클래스, Tiger
클래스, Eagle
클래스가 Animal
클래스를 상속받는다고 해보자.
class Animal {
public void move() {
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal {
public void move () {
System.out.println("사람이 두 발로 걷습니다.");
}
}
class Tiger extends Animal {
public void move () {
System.out.println("호랑이가 네 발로 뜁니다.");
}
}
class Eagle extends Animal {
public void move() {
System.out.println("독수리가 하늘을 납니다.");
}
}
public class AnimalTest {
public static void main (String[] args) {
AnimalTest aTest = new AnimalTest();
aTest.moveAnimal(new Human());
aTest.moveAnimal(new Tiger());
aTest.moveAnimal(new Eagle());
}
public void moveAnimal (Animal animal) {
animal.move();
}
}
/* 출력결과
사람이 두 발로 걷습니다.
호랑이가 네 발로 뜁니다.
독수리가 하늘을 납니다.
*/
테스트를 위해 moveAnimal
메서드에 각 인스턴스를 넣어 호출하면 모두 Animal
형으로 변환된다. animal.move()
에서 실행되는 메서드는 매개변수로 전달된 실제 인스턴스의 move()
이다. 따라서 위와같은 출력결과를 내게 된다. 결론적으로 animal.move()
라는 코드는 같지만 매개변수에 따라 실행되는 메서드가 달라지고, 실행결과가 달라진다. 이것이 바로 다형성이다.
상속과 다형성을 잘 활용하면 확장성 있고 유지보수가 편리한 프로그램을 만들 수 있다.
다운캐스팅이란, 여태까지 앞에서 살펴보았던 것처럼 상위 클래스로 형 변환 되었던 하위 클래스를 다시 원래 자료형으로 형 변환 하는 것을 말한다.
Animal ani = new Human();
와 같이 상위 클래스형으로 묵시적 형 변환이 되었던 것을 다시 Human
형으로 바꾸는 것이 다운캐스팅이다.
다운캐스팅을 하기 전에, 다운캐스팅을 하려는 인스턴스의 원래 자료형을 잘 확인해야 오류를 피할 수 있다. 인스턴스의 원래 자료형을 확인할 때 instanceof
를 사용한다.
Animal hAnimal = new Human(); //인스턴스 자료형이 Animal
if (hAnimal instanceof Human) { //원래 자료형이 Human이면
Human human = (Human)hAnimal; //다운캐스팅
}
이렇게 instanceof
로 원래 생성된 자료형이 오른쪽과 같은지 확인하고, 그 값이 true
이면 다운캐스팅을 진행하는 식이다. 다운캐스팅은 명시적으로 변환할 형을 적어주어야한다.
instanceof
를 활용하여 다운캐스팅을 하면 상속 받은 각 클래스에 존재하는 멤버변수와 메서드들에 접근할 수 있다.