다형성은 때에 따라 객체가 다르게 동작할 수 있습니다.
크게 2가지로 나눌 수 있습니다.
두 가지는 컴파일 타임 다형성인 메서드 오버로딩(overloading)과 런타임 다형성인 메서드 오버라이딩입니다.
동일한 메서드명을 가지고 있지만 매개변수가 다른 경우(매개변수의 개수, 타입, 순서) 컴파일러가 오버로드된 메서드 가운데 어떤 형식을 호출할 것인지 컴파일 단계에서 식별합니다.
상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하여
타입에 대한 혼란 없이 부모 클래스와 똑같이 사용할 수 있게 해줍니다.
다형성은 코드의 재사용성을 높이고, 유지보수를 용이하게 해줍니다.
특히 추상화(abstraction)와 함께 사용하면, 코드의 유연성과 확장성을 높일 수 있습니다.
컴파일러 타임 다형성은 다형성이 아니라는 주장도 있습니다.
실행 시간에 객체의 실제 타입에 따라서 다르게 동작하는 런타임 다형성과 다르게 정적으로 이루어지기 때문입니다.