<aside> 💡 변수, 함수, 클래스 등에서 동일한 이름이 다양한 의미로 해석될 수 있도록 구현하는 것
</aside>
동일한 이름의 메서드를 여러 개 정의하는 메서드 오버로딩은 다형성을 구현한 것이다.
상속받은 상위 클래스의 메서드를 재정의하는 메서드 오버라이딩 역시 다형성을 구현한 것이다.
상위클래스 타입의 참조변수로 하위 클래스 객체를 참조가능한 것을 말한다. 상속 관계를 활용하여 한 타입의 변수로 여러 하위 객체를 참조가능한 것 역시 다형성을 구현한 것이다.
Person person = new Person();
Programmer programmer = new Programmer();
Person programmer = new Programmer(); //다형적 참조의 예1
Person[] persons = {dancer, programmer, singer}; //다형적 참조의 예2
상위타입으로 하위타입의 객체를 선언하면, 사용할 수 있는 멤버의 수에 차이가 있다. 즉, 상위타입에서 지정한 멤버(필드와 메서드)만 사용할 수 있다는 것이다.
조상-자손 관계는 서로 형변환이 가능하지만 같은 조상 아래에 있는 형제 클래스끼리는 형변환이 불가능하다.
형변환 시, 자손 → 조상은(업캐스팅) 자동 형변환이 가능하다.
조상 → 자손은(다운캐스팅) 명시적으로 캐스팅해주어야 한다.
Programmer programmer = new Programmer();
Person person = (Person)programmer; //업캐스팅. 생략가능
Person person2 = new Person();
Dancer dancer = (Dancer)person2; //다운캐스팅. 생략불가
Singer singer = (Singer)dancer; //Error.
업캐스팅했을 때에는, 부모 클래스에 선언된 멤버만 사용 가능하다. 단, 자손 클래스에서 오버라이딩된 메서드가 있다면 자손클래스의 메서드가 호출된다.
person.walk() //Programmer클래스에서 오버라이딩한 메서드 호출
person.coding() //Error.