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) 매개변수의 순서, 갯수가 부모와 자식 클래스에서 동일해야 합니다.
이렇게 해서 자바의 메소드 오버 라이딩에 대해 알아보았습니다.