부모 클래스로부터 상속받은 메서드의 내용을 재정의하는 것을 의미한다.
부모 클래스의 메서드를 물려받아 그대로 사용할 수도 있지만 자식이 상황에 맞게 바꾸어 사용해야하는 경우에 오버라이딩을 한다고 생각하면 좋다.
//Car 클래스
public class Car {
void horn() {
System.out.println("빵빵");
}
}
//SportsCar 클래스
public class SportsCar extends Car {
@Override //annotation(애노테이션)
public void horn() {
System.out.println("엔진 " + engine + " 부앙~\n");
}
}
위와 같이 클래스 두개를 만들었을 때, main에서 car의 horn을 호출했을 때와 sportsCar의 horn을 호출했을 때는 오버라이딩된 부분 때문에 다르게 출력된다.
이 개념은 전에 this했을 때와 비슷하게 생각하면 된다.
super은 instance / super()은 생성자!
부모 클래스의 멤버를 참조할 수 있는 키워드이다.
자식 클래스 내부 선언된 멤버와 부모 클래스에서 상속된 멤버가 같은 이름을 가질 경우 사용한다.
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
// this.engine = engine; // 오류 발생
super(model, color, price);
this.engine = engine;
}
위와 같이 자식 클래스를 생성할 때 해당 매개변수를 사용해 부모 클래스 초기화를 꼭! 먼저 시켜야한다.
오버로딩된 부모클래스의 생성자가 없다고 하더라도 부모 클래스의 기본생성자는 호출되어야한다.(자식클래스 생성자를 만든다면)
위 예제에서 this.engine = engine; 이라는 코드를 쓰지않는다면 굳이 생성자를 안써도 된다고 생각할 수도 있는데 부모클래스에서 오버로딩된 생성자가 있다면 무조건 위와 같이 자식클래스에서는 생성자를 만들어야한다.
만약 부모클래스에서도 생성자를 만들지않아 표기는 하지 않지만 컴파일러에서 기본생성자만 있다고 했을 때엔 자식클래스에서도 기본생성자를 생략하여 표기하지않을 수도 있다.