//Java 클래스 상속과 메서드 오버라이드
//Bank 클래스 <- BadBank, NormalBank, GoodBank 가 상속하고 있다.
//BadBank, NormalBank, GoodBank 는 상위클래스인 Bank 의 메서드(double getInterestRate())를 오버라이딩 하고 있다.
public class Pg64 {
public static void main(String[] args) {
BadBank b1 = new BadBank();
NormalBank b2 = new NormalBank();
GoodBank b3 = new GoodBank();
System.out.println("BadBank :"+b1.getInterestRate());
System.out.println("NormalBank :"+b2.getInterestRate());
System.out.println("GoodBank :"+b3.getInterestRate());
}
}
class Bank{
public Bank() {
}
public double getInterestRate() {
return 0.0;
}
}
class BadBank extends Bank{
public BadBank() {} //생성자
@Override
public double getInterestRate() {
return 10.0;
}
}
class NormalBank extends Bank{
public NormalBank() {} //생성자
@Override
public double getInterestRate() {
return 5.0;
}
}
class GoodBank extends Bank{
public GoodBank() {} //생성자
@Override
public double getInterestRate() {
return 3.0;
}
}
public NormalBank() {} //생성자
@Override
public double getInterestRate() {
return 5.0;
}
}
class GoodBank extends Bank{
public GoodBank() {} //생성자
@Override
public double getInterestRate() {
return 3.0;
}
}
================================Manual================================
자바의 클래스 상속에서 부모 클래스의 메서드를 재정의 하는 것을 오버라이드/오버라이딩/override 라고 한다. 오버로드와 헷갈릴 수 있는데 클래스에서 함수의 매개변수를 달리하여 같은 이름의 함수를 여러개 만드는 것이고, 오버라이딩은 상속받았을 경우 부모클래스의 함수를 자식클래스에서 다시 정의하는 것이다. 따라서 오버라이딩은 매개변수와 반환타입이 반드시 동일해야 하며, 접근 범위 또한 부모클래스의 메서드보다 좁아지는 것(가령 public 을 default나 private 으로 바꾸는 것) 은 불가능하다. 또 예외를 부모클래스의 것 외에 추가하는것이 불가능하다.
오버라이딩 시에 @Override (어노테이션) 을 붙여주어도 되는데, 이는 컴파일러가 부모클래스의 메서드 선언부와 동일한지 검사하도록 만든다. 필수적인 것은 아니나 이를 통해 상위클래스의 메서드를 오버라이딩 했음을 알 수 있게 한다는 장점을 갖고 있다.
정리하자면
메서드 오버라이딩은 상속 관계 하에서 상위 클래스에 존재하는 메서드를 재정의 하는 것이다.
댓글
댓글 쓰기