하위클래스는 상위클래스를 확장한다. |
하위클래스는 상위클래스의 모든 public으로 지정한 인스턴스변수와 메소드를 상속하지만 private로 지정한 인스턴스변수와 메소드는 상속할수 없다. |
메소드는 오버라이드 할수 있지만 인스턴스변수는 오버라이드 할수 없다. |
'A는 B다' 테스트를 활용하여 상속 계층이 올바른지 확인한다. |
'A는 B다' 는 한방향으로만 작동한다. ex)하마는 동물이지만 모든 동물이 하마는 아니다. |
하위클래스에서 메소드를 오버라이드하면, 하위클래스의 인스턴스에 대해 그 메소드를 호출하면 오버라이드된 버전의 메소드가 호출된다.(맨 밑의 것) |
B가 A를 확장하고 C가 B를 확장하면 B는 A이고, C는 B이고, C는 A이다.(A→B→C) |
상위 클래스의 확장(extends)
하위 클래스에서 별도의 메소드와 인스턴스 변수를 추가할 수 있고
상위클래스에서 상속받은 메소드를 오버라이드 할 수도 있다.
■부모클래스 이름 / ■ 하위클래스 이름 / ■ 상속 예약어
//상위 클래스
public class Doctor {
boolean worksAtHospital;
void treatPatient() { }
}
//하위클래스 1
public class FamilyDoctor extends Doctor {
}
//하위클래스 2
public class Surgeon extends Doctor{
}
Doctor를 상속(extends)하는 하위 클래스 FamilyDoctor, Surgeon
doctor
↗ ↖
surgeon familydoctor
상속의 장점 | ||||||
코드가 중복되는 것을 방지한다. 상위 클래스만 변경하면 하위클래스도 변경된다. 하지만 하위클래스에서 변경된다고 상위클래스의 것이 바뀌지 않는다. | ||||||
상위클래스에서 메소드를 정의하면 그 메소드는 하위클래스로 상속될수 있고, 다른 코드에 상위클래스 형식을 쓰는 모든 하위클래스에 메소드의 용도를 알려주는 일종의 규약 | ||||||
어떤 클래스에 대한 상위 클래스를 만들면 그 상위 클래스 형식이 들어갈수 있는 모든 자리에 해당 상위 클래스와 임의 하위클래스에 속하는 객체를 마음대로 사용할 수 있다. | ||||||
상위클래스로 선언된 레퍼런스(역참조변수)를 이용하여 하위클래스 객체를 참조할수 있다.
|
단일 상속
단일상속만을 허용하고 인터페이스를 이용한 보완된 형태의 다중상속을 지원한다.
자식은 둘 이상의 부모를 가질수 없지만(단일상속) 부모는 둘 이상의 자식을 가질수 있다.
자식은 부모가 되어 자식을 가질수 있다.(확장)