[Java] #20 상속 2 (메서드 오버라이딩)

febCho·2023년 12월 3일
0

Java

목록 보기
42/53

지난 게시글에서는 '상속'의 개념에 대해 배우며 부모 클래스의 메서드와 변수는 상속 관계에 의해 메모리에 업로드되어 자식 클래스에서 호출해 사용 가능하다고 언급한 바 있다.

이번 글에서는 그 메서드를 호출해 사용하기 위해 필수인 메서드 오버라이딩에 대해 알아보겠다.

2. 메서드 오버라이딩

메서드 오버라이딩

오버라이딩은 '메서드 재정의'라고도 불리며 상속관계로 이루어진 객체들 간의 관계가 전제된다.

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() 메서드의 수행문만을 달리하여 메서드를 재정의하였다.
④ 따라서 위 예제의 출력 결과는 신형 자동차 구형 자동차가 된다.

  1. 이를 통해 알 수 있듯 '메서드 오버라이딩'은 상속 관계에 있는 자식 클래스에서 필요 시 수행문을 달리하여 메서드를 재정의함으로써, 부모 클래스의 메서드가 호출되는 것이 아니라 자식 클래스의 메서드가 호출되도록 하는 것을 말한다.

  2. 부모 클래스의 메서드를 수정하지 않고 굳이 자식 클래스에서 메서드 오버라이딩을 하는 이유는 상속 받는 하위 클래스가 여러 개일 경우 부모 클래스가 메서드를 수정하면 모든 자식 클래스가 영향을 받기 때문이다.

① 한 개의 부모 클래스에는 여러 개의 자식 클래스가 있을 수 있음.
② 단, 한 개의 자식 클래스에는 한 개의 부모 클래스만 존재함.
③ 필요 시 자식 클래스에서 메서드 재정의

  1. 반환형과 메서드명, 인자는 동일해야 하며 접근제한자는 부모의 메서드보다 넓어야만 한다. 특히 재정의 시 메서드 명에 오타를 낸다면, 그건 재정의가 아니라 새로운 메서드를 정의한 것으로 인식한다.
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() + "을 먹는다");
	}
}
출력)
아들은 밥을 먹는다
딸은 빵을 먹는다
  1. @Override (어노테이션)은 이렇듯 실수하기 쉬운 메서드 재정의 문법에 맞게 재정의가 되었는지 검증하는 역할을 한다. 만약 문법에 맞게 재정의 되지 않으면 컴파일 오류가 발생한다.

메서드명이 상이하여 컴파일 오류 발생

  1. 메서드 오버라이딩과 함께 꼭 구분하여 알아두어야 할 개념은 메서드 오버로딩이다.
    1) 메서드 오버라이딩 : 상속 관계에 있는 자식 클래스에서 부모 클래스의 메서드를 재정의, 자신만의 메서드를 만들어 사용하는 것
    2) 메서드 오버로딩 : 하나의 클래스 내 같은 이름을 갖는 메서드가 여러 개 정의되는 것
profile
Done is better than perfect.

0개의 댓글