상속
기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
class Child extends Parent { } ← Parent를 상속받는 Child
- 조상 클래스: 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스
- 자손 클래스: 자식(child) 클래스, 하위(sub) 클래스, 파생(derive) 클래스
- 자신은 부모의 모든 멤버를 상속 받는다.(생성자와 초기화 블럭은 예외)
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
- 부모 클래스의 수정은 자식 클래스에 영향을 준다.
자식 클래스의 수정은 부모 클래스에 영향을 주지 못한다.
- 자식 클래스의 인스턴스를 생성하면 부모 클래스의 멤버와 자식 클래스의 멤버가 합쳐진 인스턴스로 생성
단일 상속
- 자바에서는 오직 단일 상속만을 지원한다.
- 다중 상속을 받았을 때 같은 메서드가 다른 클래스에 존재할때 어떤 메서드를 상속받을 수 있는지 상속 받았다면 어떻게 구별할건지 어려운 문제이다.
- static 이라면 메서드 이름 앞에 클래스를 붙여 구별할 수 있지만 인스턴스라면 선언부가 같은 메서드를 구별할 수 있는 방법이 없다.
- 결국 메서드 이름이나 매개변수를 클래스끼리 구분해서 바꾸는 방법밖에 없는데 이게 여러 클래스가 얽혀 있어서 간단한 문제는 아니다.
- 결국 장점 보다 단점이 압도적으로 많아 단일 상속만을 지원한다.
Object 클래스
- 상속 계층도의 최상위에 있는 부모 클래스
- 다른 클래스로부터 상속 받지 않는 모든 클래스는 자동적으로 Object 클래스로부터 상속 받게 한다.
- 다른 클래스로 부터 상속받은 클래스의 제일 위에있는 클래스도 결국 Object로부터 상속받은 클래스다.
- 컴파일러가 extends가 없을 때 자동적으로 extends Object를 추가한다.
오버라이딩
- 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
- 부모 클래스 메서드의 이름, 매개변수, 반환 타입이 같아야한다.
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
protect → protect or public, public → public
- 조상 클래스의 메서드보다 많은 수 의 예외를 선언할 수 없다.
- 선언된 예외의 개수의 문제가 아니라 포함하는 범위에 따른 이야기다.
오버로딩 vs 오버라이딩
- 오버 로딩: 기존에 없는 새로운 메서드를 정의하는 것.