상속이란 상위 클래스의 속성(필드)과 메서드를 하위 클래스가 물려받아 기능을 확장하는 것을 말합니다.
상속을 결정할 때 가장 중요한 것은 두 클래스 사이의 논리적 관계입니다.
주의: 자바는 클래스의 다중 상속을 허용하지 않습니다. (다이아몬드 상속 문제 방지). 하나의 클래스는 오직 하나의 부모만 가질 수 있습니다.
기존의 Campus라는 부모 클래스가 있고, 지역별 캠퍼스가 이를 상속받는 구조로 재구성해 보겠습니다.
class Campus {
String location = "전국";
void info() {
System.out.println("위치: " + location);
}
}
class SeoulCampus extends Campus {
// 부모의 필드를 자식에 맞게 수정
SeoulCampus() {
this.location = "서울캠퍼스";
}
}
부모에게 물려받은 메서드가 자식 클래스에 맞지 않을 때, 이를 다시 정의하는 것을 오버라이딩이라고 합니다.
public이면 자식도 public)super: 부모 객체의 참조값에 접근할 때 사용합니다.super(): 부모의 생성자를 호출합니다. 반드시 자식 생성자의 첫 줄에 위치해야 하며, this()와 동시에 사용할 수 없습니다.자바에서 extends를 명시하지 않은 모든 클래스는 자동으로 java.lang.Object를 상속받습니다.
final은 "마지막"이라는 의미대로, 더 이상의 수정을 막는 제약 사항을 부여합니다.
| 대상 | 효과 |
|---|---|
| 변수 | 상수가 되어 초기화 후 값 변경 불가 |
| 메서드 | 자식 클래스에서 오버라이딩(재정의) 불가 |
| 클래스 | 상속 불가 (예: String 클래스) |
꿀팁!
final참조 변수(예: 배열)의 경우, 변수 자체에 새로운 객체를 할당하는 것은 안 되지만, 객체 내부의 값(배열의 요소)은 변경이 가능합니다.
Q. 부모 클래스의 모든 것이 상속되나요?
A. 아니요. 생성자와 초기화 블록(static { })은 상속되지 않습니다.
Q. 다중 상속은 왜 안 되나요?
A. 여러 부모로부터 동일한 이름의 메서드를 상속받을 경우 어떤 것을 실행해야 할지 모르는 다이아몬드 문제가 발생하기 때문입니다.
Q. super()와 this()를 한 생성자에서 같이 못 쓰는 이유는?
A. 두 키워드 모두 생성자의 첫 번째 줄에 위치해야 한다는 문법적 규칙 때문입니다.