객체지향프로그래밍의 다형성(Polymorphism)이란?

상속 후에 여러 형태의 자식 클래스 & Over Ride를 의미한다

코드 예시

  • 부모 클래스: Animal
  • Animal을 부모로 하는 자식 클래스:Cat, Dog
public class Animal {
    public void speech() {
        System.out.println("Animal speech()");
    }
}
public class Cat extends Animal {
    @Override
    public void speech() {
        System.out.println("야옹야옹");
    }

    public void cat_method() {
        System.out.println("저는 야옹이에요");
    }
}
public class Dog extends Animal {
    @Override
    public void speech() {
        System.out.println("멍멍");
    }

    public void dog_method() {
        System.out.println("난 강아지다");
    }
}

만약

최대 10개까지의 Dog 또는 Cat 클래스로 인스턴스를 만들고, 각 클래스의 메소드를 호출해보고 싶다.

Dog로만 10개를 만들 수도 있고, Cat으로만 10개를 만들 수도 있다.

Dog 타입의 배열을 10개, Cat 타입의 배열을 10개 선언해서 각자 만들어야 하나?

    // dog + cat = 10
    Dog[] dogArr = new Dog[10];
    Cat[] catArr = new Cat[10];
    dogArr[0] = new Dog();
    catArr[0] = new Cat();
    catArr[1] = new Cat();
    dogArr[1] = new Dog();

이럴 때 Dog 클래스와 Cat 클래스의 부모 클래스인 Animal을 사용할 수 있다.

Animal ani = new Dog();
  • ani는 Animal 타입으로 선언되었지만, Dog 클래스의 객체를 참조하고 있다.
  • Dog 클래스의 객체가 할당되어 있기 때문에 Dog에 정의된 메서드를 실행할 수 있어야 함
  • 그러나 ani는 Animal 타입이기 때문에, Animal 클래스에서 정의된 속성이나 메서드만 직접적으로 호출할 수 있다.
  • Dog 클래스에서 추가된 속성이나 메서드는 ani를 통해 접근할 수 없다

 

(참고) 한편, instanceof 로 인스턴스 타입을 확인할 수 있다.

    if (ani instanceof Dog) {
        System.out.println("Dog 인스턴스입니다.");
    }

 

즉, ani는 Dog 객체를 참조하고 있지만, Animal에서 상속받아 Dog에서 오버라이드한 메서드만 접근할 수 있다는 것이다.

Dog의 고유 메소드에는 어떻게 접근할 수 있을까?

 

강제 형변환

    Dog d = (Dog)ani;

Dog 객체에서 super를 참조하고 있던 포인터가 this로 포인터를 바꾼 것과 같은 결과이다.

 

 

 

정상적으로 Dog의 고유 메소드에 접근할 수 있는 것을 확인할 수 있다.

 

 

최종 코드

// 하나의 인스턴스로 관리
Animal[] animal = new Animal[10];
animal[0] = new Dog();
animal[1] = new Cat();
animal[2] = new Cat();
animal[3] = new Dog();

for (Animal a: animal) {
    if (a != null) {
        a.speech();                 // Animal으로부터 상속받은 Cat과 Dog의 오버라이드 메소드
    }
    if (a instanceof Dog) {
        Dog d = (Dog)a;             // 강제형변환 (포인터 변경)
        d.dog_method();             // Dog의 고유 메소드
    } else if (a instanceof Cat) {
        ((Cat)a).cat_method();      // 간결한 표현식
    }
}

실행결과

+ Recent posts