overriding을 하기위해서는 아래의 조건을 충족시켜야 한다.
· 메소드의 이름
· 메소드 매개변수의 숫자와 데이터타입 그리고 순서
· 메소드의 리턴 타입
위와 같이 메소드의 형태를 정의하는 사항들을 통틀어서 메소드의 서명(Signature)이라고 한다.
<잘못된 오버라이딩 예>
package day0407;
class Calculatori {
int left, right;
public void setOprands(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 SubstractionableCalculatori extends Calculatori {
public void sum() {
System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
}
public void substract() {
System.out.println(this.left - this.right);
}
public int avg() {
return ((this.left + this.right) / 2);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculatori c1 = new SubstractionableCalculatori();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
▼
그렇다면 부모클래스의 코드를 변경한다면 되는걸까?
package day0407;
class Calculatori {
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public int avg() {
System.out.println((this.left + this.right) / 2);
}
}
class SubstractionableCalculatori extends Calculatori {
public void sum() {
System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
}
public void substract() {
System.out.println(this.left - this.right);
}
public int avg() {
return ((this.left + this.right) / 2);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculatori c1 = new SubstractionableCalculatori();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
답은 아니다이다.
상위클래스와 하위 클래스의 서명(int)이 같기 때문에 메소드 오버라이딩은 할 수 있었지만
코드의 중복이 발생한다.
avg()의 부모와 자식클래그사 같은 로직을 가지고 있기때문에 중복은 제거되어야한다.
이때,
생성자와 마찬가지로 super를 사용하면 이를 해결할 수 있다.
package day0407;
class Calculatori {
int left, right;
public void setOprands(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 SubstractionableCalculatori extends Calculatori {
public void sum() {
System.out.println("실행 결과는" + (this.left + this.right) + "입니다.");
}
public void substract() {
System.out.println(this.left - this.right);
}
public int avg() {
return super.avg();
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculatori c1 = new SubstractionableCalculatori();
c1.setOprands(10, 20);
c1.sum();
System.out.println("실행 결과는"+ c1.avg());
c1.substract();
}
}
하위 클래스의 메소드 avg에서 상위 클래스의 메소드를 호출하기위해서 super를 사용하고 있다.
이 덕분에 중복을 제거 할 수 있었다.
'PL(ProgrammingLanguage) > JAVA' 카테고리의 다른 글
컴퓨터의 단위 (0) | 2021.07.31 |
---|---|
프로그래밍 언어 - 자바 (0) | 2021.07.31 |
overriding (0) | 2021.04.07 |
코드로 알아보는 상속 (0) | 2021.04.07 |
Method (0) | 2021.03.11 |