부모클래스에서 이미 정의된 메소드를 자식메소드에서 불러와서 새롭게 정의된 기능을 추가하고자 한다면 어떻게 해야할까?
class Calculator{
int left,right;
public void setOperands(int left, int right) {
this.left=left;
this.right=right;
}
public void sum() {
System.out.println(this.left+this.right);
}
public void avg() {
System.out.println((this.left+this.right)/2);
}
}
class SubstractionableCalculator extends Calculator{
//상위클래스에 있는 메소드sum을 불러와서 새로운 기능을 추가하게 된다면
//상위클래스에 있는 메소드가 아닌 하위클래스 메소드sum을 실행시키게된다.
public void sum() {
System.out.println("실행 결과는" + (this.left+this.right)+"입니다.");
}
public void substract() {
System.out.println((this.left)-(this.right));
}
}
public class CalculatorDemo{
public static void main(String[] args) {
//SubstractionableCalculator의 생성자 c1호출
SubstractionableCalculator c1=new SubstractionableCalculator();
c1.setOperands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
실행결과 :
실행 결과는30입니다.
15
-10
위와 같이 하위클래스에서 상위클래스에 있는 메소드sum을 불러와서 재정의하게 된다면,
상위클래스가 아닌 하위클래스에 있는 메소드sum을 실행하게 됩니다.
이처럼 상속받은 상위클래스에 있는 메소드 sum을 다시 재정의하여 사용하는 것을 메소드 오버라이딩이라고 합니다.
위와 같이 메소드의 형태를 정의하는 사항들을 통틀어서 메소드의 서명(signature)라고 합니다.
아래 예제는 잘못된 표현방법입니다.
오버라이딩하기 위해서는 메소드의 리턴형식이 같아야합니다.
아래와 같이 리턴형식을 같게함으로써 오버라이딩 할 수 있습니다.
그런데 return값을 보면 중복이라는 것을 볼 수 있습니다. 생성자와 마찬가지로 super를 사용하면 문제를 해결 할 수 있습니다.
class Calculator1{
int left,right;
public void setOperands(int left, int right) {
this.left=left;
this.right=right;
}
public void sum() {
System.out.println(this.left+this.right);
}
public int avg() {
return ((this.left+this.right)/2);
}
}
class SubstractionableCalculator1 extends Calculator1{
public void sum() {
System.out.println("실행 결과는" + (this.left+this.right)+"입니다.");
}
//super를 사용함으로써 return값의 중복제거
public int avg() {
return super.avg();
}
public void substract() {
System.out.println((this.left)-(this.right));
}
}
public class CalculatorDemo2{
public static void main(String[] args) {
//SubstractionableCalculator의 생성자 c1호출
SubstractionableCalculator1 c1=new SubstractionableCalculator1();
c1.setOperands(10, 20);
c1.sum();
System.out.println("실행 결과는" +c1.avg());
c1.substract();
}
}