[JAVA]overriding

kjhabc2002·2021년 4월 5일
0

창의적인 상속

부모클래스에서 이미 정의된 메소드를 자식메소드에서 불러와서 새롭게 정의된 기능을 추가하고자 한다면 어떻게 해야할까?

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();
	}

}

0개의 댓글