다형성의 3요소 : 상속(중복되는 코드 최소화) + 오버라이딩(부모가 가진 메소드 자식이 재정의) + 타입 변환
부모객체를 자식 변수에 할당하는 것은 문법적으로 불가능
즉, 자식 → 선조 타입의 변수에 할당 가능. → 묵시적 형(타입) 변환
형제 레벨에서는 형변환이라는 것 자체가 없음. 불가능 : 무조건 error
: { } 없음 / 구체적이지 못함 { 메소드 바디 }
: 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
: 호출 불가능
abstract 반환타입 메소드이름();
목적 : 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함
: 하나 이상의 추상 메소드를 포함하는 클래스 → 무조건 abstract 붙여줘야 함. 없으면 error
: 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해줌
: 추상 클래스는 객체 생성이 불가능하다
⇒ 반드시 사용되어야 하는 메소드를 추상 클래스의 추상 메소드로 설정해두면 이 클래스를 상속받는 모든 클래스에서 이 추상 메소드를 무조건 재정의해야 함
abstract class 클래스이름 {
...
abstract 반환타입 메소드이름():
...
}
최상위 부모가 추상 클래스 ⇒ 이 클래스에는 추상 메소드가 하나 이상 존재한다
⇒ 최상위 부모가 추상 클래스? ⇒ 자식 클래스에서는 상속을 통해 추상 메소드 전부를 오버라이딩 해야함 ⇒ 그래야 정상적인 클래스가 됨(new 할 수 있게 됨)
추상클래스
: 다형성으로 인해 유지보수의 편의성이 향상됨
: 다형성을 적용하려면 ? → 상속, 메소드 오버라이딩, 타입 변환 필요
: 리모콘으로 이해하면 쉬움 → 자식객체는 부모타입의 참조변수에 할당 가능
→ 리모콘이 참조하는 객체에 따라 동작한다