객체지향 프로그래밍의 대표적인 특징으로는 캡슐화, 상속, 다형성이 있다. 그 중에서 다형성은 객체지향 프로그래밍의 꽃이라 불린다. 앞서 학습한 캡슐화나 상속은 직관적으로 이해하기 쉽다. 반면에 다형성은 제대로 이해하기도 어렵고, 잘 활용하기는 더 어렵다. 하지만 좋은 개발자가 되기 위해서는 다형성에 대한 이해가 필수다.
다형성(Polymorphism)은 이름 그대로 "다양한 형태", "여러 형태"를 뜻한다.
프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 보통 하나의 객체는 하나의 타입으로 고정되어있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다는 뜻이다. 지금은 이 내용을 이해하기 보다는 참고만 해두자.
이제부터 본격적으로 다형성을 학습해보자.
다형성을 이해하기 위해서는 크게 2가지 핵심 이론을 알아야 한다.
먼저 다형적 참조라 불리는 개념에 대해 알아보자.
다형적 참조를 이해하기 위해 다음과 같은 간단한 상속 관계를 코드로 만들어보자.
부모와 자식이 있고, 각각 다른 메서드를 가진다.
package poly.basic;
public class Parent {
public void parentMethod() {
System.out.println("Parent method");
}
}
package poly.basic;
public class Child extends Parent {
public void childMethod() {
System.out.println("Child method");
}
}
package poly.basic;
public class PolyMain {
public static void main(String[] args) {
// 부모 변수가 부모 객체를 참조
Parent parent = new Parent();
parent.parentMethod();
// 자식 변수가 자식 객체를 참조
Child child = new Child();
child.parentMethod();
child.childMethod();
// 부모 변수가 자식 객체를 참조
// 다형성
Parent poly = new Child();
poly.parentMethod();
// poly.childMethod(); // 컴파일 에러
}
}
Parent method
Parent method
Child method
Parent method
부모는 자식을 담을 수 있다.
지금까지 학습한 내용을 떠올려보면 항상 같은 타입에 참조를 대입했다. 그래서 보통 한 가지 형태만 참조할 수 이싿.
그런데 Parent 타입의 변수는 다음과 같은 자신인 Parent 는 물론이고, 자식 타입까지 잠조할 수 있다. 만약 손자가 있다면 손자도 그 하위 타입도 참조할 수 있다.
자바에서 부모 타입은 자신은 물론이고, 자신을 기준으로 모든 자식 타입을 참조할 수 있다. 이것이 바로 다양한 형태를 참조할 수 있다고 해서 다형적 참조라 한다.