✅ 다형성 활용2


앞서 설명한 예제를 다형성을 사용하도록 변경해보자.




✅ 예제2


다형성을 사용하기 위해 여기서는 상속 관계를 사용한다. Animal(동물)이라는 부모 클래스를 만들고 sound() 메서드를 정의한다. 이 메서드는 자식 클래스에서 오버라이딩 할 목적으로 만들었다.

Dog, Cat, CawAnimal 클래스를 상속받았다. 그리고 각각 부모의 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로 이해하면 된다. 부모는 자식을 담을 수 있다. 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("동물 소리 테스트 종료");
}

출처 : 김영한의 실전 자바 - 기본편
https://www.inflearn.com/course/김영한의-실전-자바-기본편/dashboard

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글