Java - Polymorphism

1 분 소요

Java - polymorphism

  • polymorphism은 다음과 같은 다양한 종류로 나뉩니다.
  • Ad-hoc polymorphism: 엄밀한 의미에서 polymorphism은 아니지만, methodName이 같고 argument가 다른 경우에 대해서 작동하는 것을 말하며, method overloading이 여기에 속합니다. run-time에 결정되는 것이 아니라, compile-time에 결정되기 때문에 그냥 Compile-Time polymorphism이라고 하기도 하죠.
  • Subtype polymorphism: 그냥 subtyping이라고도 하는데, 상위 class의 reference variable로 하위 class의 Object를 가리키는 경우를 말합니다. 즉, 상위 class의 reference variable을 사용해서 여러 객체들을 담을 수 있기 때문에 polymorphism 적인 성격을 가지게 되죠. dynamic polymorphism이라고 하기도 합니다.
  • parametric polymorphism: 정확하게 type을 선언하지 않아도 여러 유형의 변수를 input으로 처리할 수 있는 함수를 만들 수 있는 것을 말하며, generic programming에 여기에 속합니다.

Subtyping

  • superclass의 reference variable은 subtype의 object를 가리킬 수 있습니다.
  • 그리고 superclass의 method는 subclass의 method에 의해서 overridding될 수 있죠.
  • 가령 아래와 같이 BaseClass와 BaseClass를 상속받는 DerivedClass가 있다고 하겠습니다. 그리고, BaseClassprint()DerivedClass에서 Override되었죠. 이를 표시하기 위해서 Annotation을 달아 주었습니다.
class BaseClass {
    BaseClass () {
    }
    public void print() {
        System.out.printf("This is BaseClass\n");
    }
}
class DerivedClass extends BaseClass{
    DerivedClass () {
    }
    @Override
    public void print() {
        System.out.printf("This is DerivedClass\n");
    }
}
  • 위와 같이 선언되어 있는 경우에는 BaseClass reference variable를 사용해서 subClass의 객체를 가리킬 수 있고, 또 subClass의 method를 call해서 사용할 수도 있습니다.
  • 다만, 이렇게 되기 위해서는 반드시 해당 method의 이름이 baseClass에도 있어야 합니다. 즉, Override해야만 사용할 수 있는 것이지, 만약 baseClass에서 print라는 이름의 method가 없다면 c1 객체에서 print()를 call하여 사용할 수 없죠.
BaseClass c1 = new DerivedClass();
c1.print();

댓글남기기