오버라이딩은 한국어로는 "재정의"라는 뜻이다.
상속은 자식클래스가 부모클래스의 것을 그대로 가지고 온다.
이때, 부모의 것을 가져오는데 추가적으로 더 필요한 일들을 정의할 수 있는데
이를 오버라이딩(overrding)이라고 한다.
오버라이딩은 "재정의"라는 말처럼
부모클래스의 것을 쓰지 않고 자식이 부모의 것을 재정의하여 사용하는 것입니다.
클래스에서의 오버라이딩
클래스를 상속받을 상태에서
오버라이딩하면, 자식클래스의 메서드를 호출할 때, 자식클래스의 메서드가 호출됩니다.
오버라이딩의 조건
오버라이딩 하려면 return 타입이 같아야 한다.
너무나 당연하게 메서드 이름도 같아야 한다.매개변수 또한 개수와 타입이 맞아야 한다(매개변수의 이름은 달라도 된다.)=> 즉, 메서드 시그니처가 같아야 한다. (메서드이름, 매개변수 개수, 매개변수 타입)또한 추가로 "메서드의 리턴타입까지 같아야 한다."
정리하면
- 메서드의 이름
- 메소드 매개변수의 (개수, 타입, 순서)
- 메서드의 리턴 타입
이 같아야 메소드 오버라이딩을 할 수 있다.
만약 return 타입이 다르다면?
컴파일 오류가 발생합니다.
그러나 자바 5 이전 버전에서는 오버라이딩된 메서드의 반환 타입을
하위 클래스의 타입으로 변환하는 것이 허용되었습니다.
하지만 자바 5 이후 버전부터는 반환 타입 또한 엄격하게 일치해야 하므로 변경되었습니다.
메서드 오버라이딩 예제 (컴파일 에러 예제)
main
package overriding;
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 class example1 {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
}
}
에러코드
java: avg() in overriding.SubstractionableCalculator cannot override avg() in overriding.Calculator
return type int is not compatible with void
에러코드를 보면,
avg() 오버라이딩 제대로 되지 않았다.
리턴타입이 int형이 호환되지 않는다.
라고 한다.
※ not compatible: 호환되지 않음. |
⇒ avg() 메서드를 반환형 같게 수정하면 해결할 수 있다.
Super 키워드 이용
만약 위에처럼 자식클래스를 오버라이딩 할 건데 일이 같다.
그러면 super 키워드를 이용할 수 있다.
public int avg(){
return super.avg();
}
'CS🖥️ > OOP' 카테고리의 다른 글
[OOP] 오버라이딩 & 오버로딩 비교하기(핵심정리) (0) | 2023.09.02 |
---|---|
[OOP] 상속과 생성자 & super (0) | 2023.09.02 |
[OOP] 오버로딩 & 메서드 시그니처 (overloading & method signature) (0) | 2023.09.02 |