'재정의' '새롭게 정의한다' 라는 뜻이며, '상속'과 밀접하게 관련되어 있다.
상속은 부모 클래스의 메소드를 그대로 쓰고, 새로운 메소드를 추가하여 쓰는것 이라면,
오버라이딩은 부모 클래스의 메소드를 필요에 따라 재정의하여 기능을 변경하는 것이다.
부모 클래스도 가지고 있고 자식 클래스도 가지고 있는 메소드를
자식 클래스에서 재정의하고 이 메소드를 호출하면,
부모 클래스가 가진 메소드는 무시되고 자식 클래스가 가진 메소드가 실행된다.
부모 클래스가 가진 메소드의 반환 타입이 void
이면 이를 상속받아 오버라이딩 하는 메소드 또한 반환 타입이 void
여야 한다.
또한 메소드의 이름도 같아야 하며, 메소드에 매개변수가 있을 경우, 매개변수의 개수도 같아야 하고, 그 매개변수는 타입도 같아야한다.
위의 세가지 항목이 부모 클래스, 자식 클래스에서 모두 같아야 오버라이딩이 가능하다.
만일, 부모 클래스에 정의된 메소드에서 수정이 발생하면, 자식 클래스에서도 수정을 해주어야 한다. 이때 자식 클래스에서 super
키워드를 사용하면, 수정된 부모 클래스의 메서드를 사용할 수 있다.
package pr01;
class Calculator {
int left, right;
public Calculator(){
}
public Calculator(int a, int b){
this.right=a;
this.left=b;
}
public void sum(){
System.out.println(this.left+this.right);
}
public int avg(){
return ((this.left+this.right)/2);
}
}
class Subtract extends Calculator{
public Subtract(int a, int b) {
this.left=a;
this.right=b;
}
public void sub(){
System.out.println(this.left-this.right);
}
@Override
public void sum(){
System.out.println("실행결과는 "+(this.left+this.right)+" 입니다");
}
@Override
public int avg() {
return super.avg();
}
}
public class test {
public static void main(String[] args) {
Subtract s1 = new Subtract(10,20);
s1.sum();s1.avg();s1.sub();
}
}
/*
실행결과는 30 입니다
15
-10
*/