앞서 설명한 예제를 다형성을 사용하도록 변경해보자.
다형성을 사용하기 위해 여기서는 상속 관계를 사용한다. Animal
(동물)이라는 부모 클래스를 만들고 sound()
메서드를 정의한다. 이 메서드는 자식 클래스에서 오버라이딩 할 목적으로 만들었다.
Dog
, Cat
, Caw
는 Animal
클래스를 상속받았다. 그리고 각각 부모의 sound()
메서드를 오버라이딩 한다.
package poly.ex2;
public class Animal {
public void sound() {
System.out.println("동물 울음 소리");
}
}
package poly.ex2;
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
package poly.ex2;
public class Cat extends Animal{
@Override
public void sound() {
System.out.println("냐옹");
}
}
package poly.ex2;
public class Caw extends Animal{
@Override
public void sound() {
System.out.println("음매");
}
}
package poly.ex2;
public class AnimalPolyMain1 {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Caw caw = new Caw();
soundAnimal(dog);
soundAnimal(cat);
soundAnimal(caw);
}
private static void soundAnimal(Animal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
}
soundAnimal (dog)
을 호출soundAnimal (Animal animal)
에 Dog
인스턴스가 전달Animal animal = dog
로 이해하면 된다. 부모는 자식을 담을 수 있다. Animal
은 Dog
의 부모다.animal.sound()
메서드를 호출한다. animal
변수의 타입은 Animal
이므로 Dog
인스턴스에 있는 Animal
클래스 부분을 찾아서 sound()
메서드를 실행한다. 그런데 하위 클래스인 Dog
에서 sound()
메서드를 오버라이딩 했다. 따라서 오버라이딩한 메서드가 우선권을 가진다.Dog
클래스에 있는 sound()
메서드가 호출되므로 “멍멍”
이 출력된다.이 코드의 핵심은 Animal animal
부분이다.
animal
변수는 자식인 Dog
, Cat
, Caw
의 인스턴스를 참조할 수 있다. (부모는 자식을 담을 수 있다.)animal.sound()
를 호출해도 Dog.sound()
, Cat.sound()
, Caw.sound()
와 같이 각 인스턴스의 메서드를 호출할 수 있다. 만약 자바에 메서드 오버라이딩이 없었다면 모두 Animal
의 sound()
가 호출되었을 것이다.다형성 덕분에 이후에 새로운 동물을 추가해도 다음 코드를 그대로 재사용 할 수 있다. 물론 다형성을 사용하기 위해 새로운 동물인 Animal
을 상속 받아야 한다.
private static void soundAnimal(Animal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
출처 : 김영한의 실전 자바 - 기본편
https://www.inflearn.com/course/김영한의-실전-자바-기본편/dashboard