상속이란
- 상위 클래스의 속성(=멤버변수)과 메서드(멤버메서드)를 물려 받아 자식 클래스를 정의하는 것
- 상위 클래스가 쓰던 것을 그대로 쓰는데, 거기에 더 확장하고 차별화를 두고 싶을 때 사용
- 상위, 부모, super클래스 <---- 하위, 자식, sub 클래스
자동차 / 개 / 사람 <---- 세단, 트럭,... / 말티즈, 요크셔테리어,... / 요리사, 학생,...
상속의 특징
- 확장성, 재사용성: 자동차 리스트를 관리하는데, 별개로 세단과 전기차, 버스 등을 별도로 관리하고 싶다면?
자동차의 속성을 그대로 가져가면서도 버스, 수용인원 등의 별도 속성을 관리할 수 있도록
상속을 활용하여 하위 클래스를 생성할 수 있다. - 자식 클래스는 부모 클래스의 멤버 변수와 메서드들을 마치 본인이 선언한 것처럼 사용이 가능
- extends 키워드를 사용해 상속받을 수 있다 :
[접근제어자] (static) 클래스명 extends 부모클래스명 {
} - 생성자 호출 시 super() 키워드 사용! (생략해도 구동 시 알아서 부모 클래스에서 찾아온다.)
- super키워드는 반드시 자식클래스 생성자 내 첫 번째 줄에 위치해야만 한다!
class Car { // 부모 클래스
String brand;
int year;
// 기본 생성자
Car() {
this.brand = "Unknown";
this.year = 0;
System.out.println("Car의 기본 생성자가 호출되었습니다.");
}
// 파라미터를 입력받는 생성자
Car(String brand, int year) {
this.brand = brand;
this.year = year;
System.out.println("Car의 파라미터 생성자가 호출되었습니다.");
}
}
class Sedan extends Car { //자식 클래스
int seats;
// 기본 생성자
Sedan() {
// super()는 부모 클래스의 기본 생성자를 호출합니다.
super();
this.seats = 5;
System.out.println("Sedan의 기본 생성자가 호출되었습니다.");
}
// 파라미터를 입력받는 생성자
Sedan(String brand, int year, int seats) {
// super(brand, year)는 부모 클래스의 파라미터를 입력받는 생성자를 호출합니다.
super(brand, year);
this.seats = seats;
System.out.println("Sedan의 파라미터 생성자가 호출되었습니다.");
}
}
Object 클래스??
- 모든 클래스는 Object라는 클래스를 기본적으로 상속받고 있다. extends Object를 쓰지 않아도 알아서 상속한다.
- equals(), hashCode(), toString() 등의 메서드를 선언하지 않고 사용하는 것은 Object클래스에 이미 마련되었기 때문!
오버라이딩
- 상위 클래스에서 선언된 메서드를 상속받은 자식 클래스에서 재정의하는 것 ( = 덮어쓰기)
- 메서드의 이름, 반환형, 매개변수가 모두 동일해야 한다! = 단지 메서드 내부 로직이 바뀌는 것!
- 반드시 상속 관계에서만 사용 가능
- 어노테이션 표시를 해야 한다. (권장)
- 조상보다 더 큰 예외를 던질 수 없다.
class Car {
void startEngine() {
System.out.println("엔진이 켜졌습니다.");
}
}
class ElectricCar extends Car {
// 오버라이딩: ElectricCar만의 방식으로 startEngine 메서드를 다시 정의합니다.
@Override // 어노테이션
void startEngine() {
System.out.println("전기 엔진이 조용히 켜졌습니다.");
}
}
public class Main {
public static void main(String[] args) {
ElectricCar myElectricCar = new ElectricCar();
myElectricCar.startEngine(); // "전기 엔진이 조용히 켜졌습니다." 출력
}
}