JAVA

자바 상속 기초 3) 메소드 overriding - 공부하는 도비

DOVISH WISDOM 2022. 4. 2. 19:24  
728x90
반응형

자바의 상속을 통해서 상위 클래스의 기능을 하위 클래스로 물려줄 수 있었습니다.

하지만, 상속을 하게 되면 하위 클래스는 상위 클래스의 메소드 변경 없이 단순 기능 추가만 할 수 있습니다.

만약 그래야 한다면 제약이 상당할 것입니다.

 

이런 제약을 벗어나기 위해서 하위 클래스가 부모 클래스의 기본적인 동작을 변경할 수 있어야 하는데 

이런 맥락에서 도입된 기능이 메소드 오버 라이딩(overriding)입니다.

 

메소드 오버 라이딩은 재정의, 새롭게 정의한다는 뜻을 가지고 있습니다.

 

즉, 부모 클래스에 선언한 메소드를 자식 클래스에서 동일한 메소드명으로 재 정의 해주면, 

main에서 이 메소드를 호출했을 때, 부모 클래스가 아닌 자식 클래스에 있는 메소드를 호출하게 끔하는 것입니다.

 

package Inferitance;

class Calcul_test {
	int left, right;
	public Calcul_test(int left, int right)
	{
		this.left = left;
		this.right = right;
	}
	public void Sum()
	{
		System.out.print(this.left + this.right);
	}
	public double Avg()
	{
		return (this.left + this.right) / 2;
	}
}

class Calcul_test_2 extends Calcul_test {
	public Calcul_test_2(int left, int right)
	{
		super(left, right);
	}
	public void Sum()
	{
		super.Sum();
		System.out.print("은" + " " +this.left +"과 " + this.right + "를 더한 값");
	}
	public double Avg()
	{
		double avg = super.Avg();
		return avg * 2;
	}
	public void Mul()
	{
		System.out.println(this.left * this.right);
	}
	
}

public class Overriding_2 {

	public static void main(String[] args) {

		Calcul_test Cal = new Calcul_test(60, 30);
		
		System.out.print("Cal의 Sum : ");
		Cal.Sum();
		System.out.println("\nCal의 Avg : " + Cal.Avg());
		
		
		Calcul_test_2 Cal_2 = new Calcul_test_2(40, 20);
		
		System.out.print("Cal_2의 Sum : ");
		Cal_2.Sum();
		System.out.println("\nCal_2의 Avg : " + Cal_2.Avg());
		System.out.print("Cal_2의 Mul : ");
		Cal_2.Mul();
	}

}

 

위는 간단한 메소드 오버 라이딩 예제입니다. 

 

부모 클래스에 있는 Sum(), Avg()를 자식 클래스에서 다시 재정의하면서 메소드를 조금 더 구체화시켜주었습니다.

 

메소드 재정의 시 super라는 함수가 필요합니다. 

 

super는 상속의 생성자 부분에서도 잠깐 다뤘던 내용인데, 부모 클래스를 뜻합니다. 

 

따라서, super.Sum(), super.Avg() 형태로 사용하면, 부모 클래스에 있는 기능을 실행시키고 

사용자는 그 내용에다가 필요한 부분을 더 추가할 수 있습니다. 

 

 

메소드 오버 라이딩에는 조건이 있는데, 

1) 재정의할 메소드의 명, 2) 메소드의 retrun 타입, 3) 매개변수의 순서, 갯수가 부모와 자식 클래스에서 동일해야 합니다.

 

이렇게 해서 자바의 메소드 오버 라이딩에 대해 알아보았습니다.