상속은 코드의 재활용을 문법이 아니다.
상속의 목적은 연관된 일련의 클래스들에 대해 공통적인 규약을 정의하기 위함이다.
부모 클래스 ↔ 자식 클래스
상위 클래스 ↔ 하위 클래스
기초 클래스 ↔ 유도 클래스
class Man {...} // 부모 클래스
class BusinessMan extends Man {...} // 자식 클래스
자식 클래스의 인스턴스는 부모 클래스의 인스턴스도 포함하고 있어, 접근이 가능하다.
그러나, 부모 클래스의 멤버가 private으로 선언되었다면 존재는 하지만 접근을 불가하다.
자식 클래스는 부모 클래스의 멤버 또한 가지고 있기 때문에 자식 클래스의 초기화 시에 부모 클래스의 초기화도 필요하다.
코드의 규칙을 따르는 것은 중요하기 때문에, 자식 인스턴스에서 부모 인스턴스를 초기화시킬 때에는 부모 클래스의 생성자를 통해서 초기화를 시켜야 한다.
모든 멤버는 그 멤버가 속한 클래스의 생성자를 통해서 초기화를 시켜야 한다.
하위 클래스의 생성자는 반드시 상위 클래스의 생성자를 호출하게 되어있다. 만약, 상위 클래스의 생성자가 선언되어 있지 않다면 컴파일러가 자동적으로 void 생성자를 호출한다.
상위 클래스의 생성자 실행 후, 하위 클래스의 생성자가 실행된다.
super()
는 하위 클래스의 생성자에서만 사용되고 이를 통해서 상위 클래스의 생성자를 호출할 수 있다.
또한, 상위 클래스의 생성자가 선언되지 않은 경우, 컴파일러는 자동적으로 super()
를 삽입하여 실행한다.
static으로 선언된 클래스 변수, 클래스 메소드는 상속 되지 않는다.
그러나 접근 수준 지시자에서 허용된다면, 하위 클래스에서 이름만으로 접근 가능하다.