Home > 2024 > Java > ☕️[Java] 다형성 활용2

☕️[Java] 다형성 활용2
Java Programming Language

다형성 활용2

이번에는 앞서 설명한 예제를 다형성을 사용하여 변경해보겠습니다.

다형성을 사용하기 위해 여기서는 상속 관계를 사용합니다.

  • Animal(동물) 이라는 부모 클래스를 만들고 sound() 메서드를 정의합니다.
    • 이 메서드는 자식 클래스에서 오버라이딩 할 목적으로 만들었습니다.
  • Dog, Cat, CawAnimal 클래스를 상속받았습니다.
    • 그리고 각각 부모의 sound() 메서드를 오버라이딩 합니다.

기존 코드를 유지하기 위해 새로운 패키지를 만들고 새로 코드를 작성해보겠습니다.
“주의! 패키지 이름에 주의합시다 import를 사용해서 다른 패키지에 있는 같은 이름의 클래스를 사용하면 안됩니다.”

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 Animal {
  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 animla)Dog 인스턴스가 전달됩니다.
      • Animal animal = dog로 이해하면 됩니다. 부모는 자식을 담을 수 있습니다. AnimalDog의 부모입니다.
  • 메서드 안에서 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()와 같이 각 인스턴스의 메서드를 호출할 수 있습니다.
    • 만약 자바에 메서드 오버라이딩이 없었다면 모두 Animalsound()가 호출되었을 것입니다.

다형성 덕분에 이후에 새로운 동물을 추가해도 다음 코드를 그대로 재사용 할 수 있습니다.

  • 물론 다형성을 사용하기 위해 새로운 동물은 Animal을 상속 받아야합니다.
    private static void soundAnimal(Animal animal) {
      System.out.println("동물 소리 테스트 시작");
      animal.sound();
      System.out.println("동물 소리 테스트 종료");
    }