하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다

부모 클래스의 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하려 구현하고 있다 다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나


참조 변수의 다형성

부모 클래스의 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있는데 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 적어야 한다

class Parent { ... }
class Child extends Parent { ... }
...

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.

특정 타입의 참조 변수로 당연히 같은 타입의 인스턴스를 참조할 수 있다 (참조 변수로 쓸 멤버의 개수 == 실제 인스턴스의 멤버 개수)

부모 클래스 타입의 참조 변수로 당연히 자식 클래스 타입의 인스턴스를 참조할 수 있다 (부모 클래스 타입 참조 변수로 쓸 인스턴스 멤버의 개수 > 자식 클래스 인스턴스의 멤버 개수)

자식 클래스 타입의 참조 변수로 당연히 부모 클래스 타입의 인스턴스를 참조할 수 없다 (자식 클래스 타입 참조 변수로 쓸 인스턴스 멤버의 개수 < 부모 클래스 인스턴스의 멤버 개수)

<aside> 💡 클래스는 상속을 통해 확장될 수는 있어도 축소될 수 없기 때문에 자식 클래스에서 사용할 수 있는 멤버의 개수가 언제나 부모 클래스와 같거나 많게 된다

</aside>


참조 변수의 타입 변환

다음과 같은 조건에 따라 타입 변환을 할 수 있다

  1. 서로 상속 관계에 있는 클래스 사이에만 변환할 수 있다
  2. 자식 클래스 타입에서 부모 클래스 타입으로의 타입 변환은 생략할 수 있다
  3. 하지만 부모 클래스 타입에서 자식 클래스 타입으로의 타입 변환은 반드시 명시해야 한다

참조 변수의 타입 변환도 기본 타입의 타입 변환과 마찬가지로 타입캐스트 연산자(())를 사용한다