반응형
package org.opentutorials.javatutorials.overriding.example1;
class Calculator {
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 SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public int avg() {
return (this.left + this.right)/2;
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
// 이것은 아래와 같은 에러를 발생한다.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The return type is incompatible with Calculator.avg()
at org.opentutorials.javatutorials.overriding.example1.SubstractionableCalculator.avg(CalculatorDemo.java:26)
at org.opentutorials.javatutorials.overriding.example1.CalculatorDemo.main(CalculatorDemo.java:40)
// overriding 하기 위한 조건이 있는데, 메소드의 리턴형식이 같아야 한다.
// 상위클래스는 void이고, 하위클래스는 int이기 때문에 호환되지 않는다는 에러다.
Overriding을 하기 위해서는 데이터 타입 뿐만 아니라 아래와 같은 조건이 맞을 때 가능하다.
- 메소드의 이름
- 메소드 매개변수의 숫자와 데이터 타입, 그리고 순서
- 메소드의 리턴타입
위와 같이 메소드의 형태를 정의하는 사항을 일컬어 메소드 시그니쳐(Signature)라고 말한다. 위의 에러는 즉, 메소드들 간의 시그니처가 달라서 생긴 문제다.
package org.opentutorials.javatutorials.overriding.example1;
class Calculator {
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);
}
// 아래와 같이 리턴타입을 int로 변경함으로써 에러가 사라진다.
// void가 아니므로, int다음 return 을 넣어주는 것이다.
public int avg() {
return ((this.left + this.right) / 2);
}
}
class SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
// 아래와 같이 리턴타입을 int로 변경함으로써 에러가 사라진다.
// void가 아니므로, int다음 return 을 넣어주는 것이다.
public int avg() {
return ((this.left + this.right) / 2);
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
그런데 문제가 하나 생겼다.
에러는 나오지 않았지만, 상위클래스를 변경하면서 하위클래스와 동일한 코드가 중복되게 되었다.
return ((this.left + this.right) / 2);
리팩토링 원칙에서 벗어난다.
package org.opentutorials.javatutorials.overriding.example1;
class Calculator {
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 SubstractionableCalculator extends Calculator {
public void sum() {
System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
}
public int avg() {
// 이렇게 생성자 상속 때와 마찬가지로, super를 사용하여
// 상위클래스의 메소드도 가져올 수 있다.
return super.avg();
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
System.out.println("실행 결과는" + c1.avg());
c1.substract();
}
}
public int avg() {
// super.상위메소드();
return super.avg();
}
반응형
'Programming > Java' 카테고리의 다른 글
java 제네릭 (0) | 2022.01.30 |
---|---|
ArrayList<datatype> al = new ArrayList<datatype>(); (0) | 2022.01.30 |
상속과 생성자 (기본생성자와 super) (0) | 2022.01.29 |
extends 상속 (0) | 2022.01.29 |
자바 생성자 (0) | 2022.01.29 |