지난 게시글에서는 '상속'의 개념에 대해 배우며 부모 클래스의 메서드와 변수는 상속 관계에 의해 메모리에 업로드되어 자식 클래스에서 호출해 사용 가능하다고 언급한 바 있다.
이번 글에서는 그 메서드를 호출해 사용하기 위해 필수인 메서드 오버라이딩에 대해 알아보겠다.

오버라이딩은 '메서드 재정의'라고도 불리며 상속관계로 이루어진 객체들 간의 관계가 전제된다.
package kr.s22.object.extention;
//부모 클래스
class GrandParent{
public String getCar() {
return "구형 자동차";
}
}
//자식 클래스
class Father extends GrandParent{
public String getCar() {
return "신형 자동차";
}
}
class Uncle extends GrandParent{
}
public class OverridingMain01 {
public static void main(String[] args) {
Father ft = new Father();
System.out.println(ft.getCar());
Uncle uc = new Uncle();
System.out.println(uc.getCar());
}
}
우선 위 예제의 구조를 보자.
① GrandParent라는 클래스는 getCar()라는 메서드를 가지고 있다.
② 자식 클래스인 Father와 Uncle은 각각 GrandParent를 상속받아, 객체 생성 후 getCar() 메서드를 호출해 사용할 수 있게 되었다.
③ 이때, Father 클래스는 getCar() 메서드의 수행문만을 달리하여 메서드를 재정의하였다.
④ 따라서 위 예제의 출력 결과는신형 자동차구형 자동차가 된다.
이를 통해 알 수 있듯 '메서드 오버라이딩'은 상속 관계에 있는 자식 클래스에서 필요 시 수행문을 달리하여 메서드를 재정의함으로써, 부모 클래스의 메서드가 호출되는 것이 아니라 자식 클래스의 메서드가 호출되도록 하는 것을 말한다.
부모 클래스의 메서드를 수정하지 않고 굳이 자식 클래스에서 메서드 오버라이딩을 하는 이유는 상속 받는 하위 클래스가 여러 개일 경우 부모 클래스가 메서드를 수정하면 모든 자식 클래스가 영향을 받기 때문이다.
① 한 개의 부모 클래스에는 여러 개의 자식 클래스가 있을 수 있음.
② 단, 한 개의 자식 클래스에는 한 개의 부모 클래스만 존재함.
③ 필요 시 자식 클래스에서 메서드 재정의
package kr.s22.object.extention;
//부모 클래스
class Mother{
public String getLunch() {
return "밥";
}
}
//자식 클래스
class Son extends Mother{
}
//자식 클래스
class Daughther extends Mother{
@Override
public String getLunch() {
return "빵";
}
}
public class OverridingMain02 {
public static void main(String[] args) {
Son s = new Son();
System.out.println("아들은 " + s.getLunch() + "을 먹는다");
Daughther d = new Daughther();
System.out.println("딸은 " + d.getLunch() + "을 먹는다");
}
}
출력)
아들은 밥을 먹는다
딸은 빵을 먹는다
