다형성이란 말 그대로 다양한 형태를 가지고 있음을 뜻합니다. 자바에서 가르키는 다형성이란 객체가 다양한 형태를 띌 수 있다 를 뜻합니다. 요고는 아래 예시를 통해 확인하면 쉽게 이해할 수 있습니다.
poly 라는 패키지 아래에 Parent, Child 클래스가 각각 존재하고, Child 클래스가 Parent 클래스 상속을 받았다고 가정해보겠습니다.
poly
- Parent.java, Child.java, OverridingMain.java
package poly;
public class Parent {
public String value = "parent";
public void method() {
System.out.println("Parent.method");
}
}
package poly;
public class Child extends Parent{
public String value = "child";
@Override
public void method() {
System.out.println("Child.method");
}
}
package poly;
public class OverridingMain {
public static void main(String[] args) {
Child child = new Child();
System.out.println("child -> child");
System.out.println("value = " + child.value);
Parent parent = new Parent();
System.out.println("parent -> parent");
System.out.println("value = " + parent.value);
// 부모 변수가 자식 인스턴스 참조 (다형적 참조)
Parent poly = new Child();
System.out.println("parent -> child");
System.out.println("value = " + poly.value);
poly.method();
}
}
main 코드
실행결과:
child -> child
value = child
parent -> parent
value = parent
parent -> child
value = parent
Child.method
여기서 Parent poly = new Child() 부분이 바로 다형성을 나타내는데, 부모 변수에 자식 인스턴스를 담은 것입니다. 즉, 부모 클래스가 부모 인스턴스를 생성하는 것 뿐만 아니라 다양한 자식들의 인스턴스를 함께 생성할 수 있습니다. 그림으로 살펴보면 아래와 같습니다.
<출처: 김영한 실전 자바 강의 교안>
조금 더 구체적으로, 다형성은 부모라는 하나의 객체가 여러 자식들의 타입에 접근이 가능한 능력을 가르킵니다. (위의 예제에서는 paraent 인스턴스 뿐만 아니라 child 인스턴스도 함께 메모리에 생성)
참고로 부모 변수는 자식 변수, 자식 변수의 자식 변수... 등에 접근 할 수 있지만, 반대로 자식 변수가 부모 변수에 접근할 수 없는 것을 유의 해야 합니다.