[Java] Polymorphism ( 다형성 )

임혜정 ·2021년 10월 20일
0

Java

목록 보기
15/16

Polymorphism (= 다형성 )


상속관계에 있는 클래스에서 상위클래스가 하위클래스들 에게 동일한 메세지를 보냈을때, 하위클래스들이 서로 다르게 동작시키는 객체지향 원리이다.



다형성의 전제조건


  • 상속관계가 되어야한다.

  • 객체 생성을 upcasting 으로 해야한다.
    (상위클래스가 하위클래스에게 메세지를 보내야 하기 때문이다)

  • 하위클래스가 반드시 override 해야한다. (다형성 보장을 위해)

  • 동적 바인딩을 통해 실현된다.



다형성 활용 방법


부모클래스를 잘 활용해야한다.


1. 다형성 인수 (데이터 이동)


다형성 인수 활용 전

  • 동물 class가 늘어날수록 display 메서드도 늘어나는 문제점이 있다.

  • 따라서 프로그램을 확장하는것이 어렵다.

public class Test1 {
  public static void main(String[] args) {
  
    Dog d = new Dog();
    display(d);
    Cat c = new Cat();
    display(c);
  }

  private static void display(Dog d) {
  }

  private static void display(Cat c) {
  }
}



다형성 인수 활용 후

  • 메서드를 하나로 만들어주고 대신 부모타입을 인자로 받는다.

  • 이때 r을 다형성 인수라고 한다.

public class After {
  public static void main(String[] args) {
  
    Dog d = new Dog();
    display(d);
    Cat c = new Cat();
    display(c);
  }

  private static void display(Animal r) {
    r.eat();

    // r이 Cat으로 형변환 가능하니?
    if (r instanceof Cat) {
      ((Cat)r).night(); // downcasting
    }
  }
}
  • instanceof: 타입을 알아보는것이다.



2. 다형성 배열 (서로 다른 객체를 담을 수 있다)


배열임에도 불구하고 서로 다른 타입을 저장할 수 있다.

배열에는 서로 다른 타입이 들어가면 안된다.

public class Test2 {
  public static void main(String[] args) {
    // 다형성 배열
    // Dog, Cat 을 저장할 배열을 생성한다

    Animal[] ani = new Animal[2];

    ani[0] = new Dog();
    ani[1]= new Cat();


    for (int i = 0; i < ani.length; i++) {
      ani[i].eat();

      if (ani[i] instanceof Cat) {
        ((Cat) ani[i]).night();
      }
    }
    
    System.out.println("");
    System.out.println("===========disply 함수로 출력==========");
    display(ani);

  }

  private static void display(Animal[] ani) {
    for (int i = 0; i < ani.length; i++) {
      ani[i].eat();

      if (ani[i] instanceof Cat) {
        ((Cat) ani[i]).night();
      }
    }
  }
}
profile
포기하지 않고 끝까지 🐥

0개의 댓글

관련 채용 정보