
✅ 다형성 활용2
앞서 설명한 예제를 다형성을 사용하도록 변경해보자.
✅ 예제2
다형성을 사용하기 위해 여기서는 상속 관계를 사용한다. Animal(동물)이라는 부모 클래스를 만들고 sound() 메서드를 정의한다. 이 메서드는 자식 클래스에서 오버라이딩 할 목적으로 만들었다.
Dog, Cat, Caw는 Animal 클래스를 상속받았다. 그리고 각각 부모의 sound() 메서드를 오버라이딩 한다.
✏️ Animal
package poly.ex2;
public class Animal {
public void sound() {
System.out.println("동물 울음 소리");
}
}
✏️ Dog
package poly.ex2;
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
✏️ Cat
package poly.ex2;
public class Cat extends Animal{
@Override
public void sound() {
System.out.println("냐옹");
}
}
✏️ Caw
package poly.ex2;
public class Caw extends Animal{
@Override
public void sound() {
System.out.println("음매");
}
}
✏️ AnimalPolyMain1
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("동물 소리 테스트 종료");
}'Back-end > Java' 카테고리의 다른 글
| [Java - 기본] 추상 클래스1 (0) | 2024.05.04 |
|---|---|
| [인프런 Java] 다형성 활용3 (0) | 2024.05.03 |
| [Java - 기본] 다형성 활용1 (0) | 2024.05.02 |
| [Java - 기본] 다형성과 메서드 오버라이딩 (0) | 2024.05.02 |
| [Java - 기본] instanceof (0) | 2024.05.01 |