2021. 1. 28. 02:49ㆍJava
● 메소드 오버라이딩
오버라이딩(overriding)이란?
조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩이라 한다. (override의 사전적 의미는 '~위에 덮어쓰다(overwrite)' 이다.
오버라이딩의 조건?
오버라이딩은 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부는 조상의 것과 완전히 일치해야 한다. 그래서 오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다. (중요)
- 자손 클래스에서 오버라이딩 하는 메서드는 조상클래스의 메서드와
- 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
- 참고 : JDK1.5부터 '공변 반환타입'이 추가되어 반환타입을 자손 클래스의 타입으로 변경하는 것은 가능하도록 조건이 완화되었다.
한마디로 요약하자면 선언부가 서로 일치해야 한다는 것이다. 다만 접근 제어자(access modifier)와 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.
- 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할 수 없다.
만일 조상 클래스에 정의된 메서드의 접근제어자가 protected라면, 이를 오버라이딩 하는 자손 클래스의 매서드는 접근제어자가 protected나 public이어야 한다. 대부분의 경우 같은 범위의 접근 제어자를 사용한다. 접근제어자의 접근 범위를 넓은것에서 좁은 것 순으로 나열하면 public, protected, (default), private 이다. - 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
아래의 코드를 보면 Child클래스의 parentMethod()에 선언된 예외의 개수가 조상인 Parent클래스의 parentMethod()에 선언된 예외의 개수보다 적으므로 바르게 오버라이딩 되었다.
class Parent {
void parentMethod() throws IOException, SQLException {
...
}
}
class Child extends Parent {
void parentMethod() throws IOException {
...
}
}
여기서 주의해야 할 점은 단순히 선언된 예외의 개수의 문제가 아니라는 것이다.
class Child extends Parent {
void parentMethod() throws Exception {
...
}
}
위와 같이 오버라이딩을 하였다면, 분명히 조상클래스에 정의된 메서드보다 적은 개수의 예외를 선언한 것처럼 보이지만 Exception은 모든 예외의 최고 조상이므로 가장 많은 개수의 예외를 던질 수 있도록 선언한 것이다.
결론은, 조상클래스의 메서드를 자손클래스에서 오버라이딩 할 때
- 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
Q. 조상 클래스에 정의된 static메서드를 자손 클래스에서 같은 이름의 static 메서드로 정의할 수 있는가?
A. 가능하다. 하지만 이것은 각 클래스에 별개의 static메서드를 정의한 것일 뿐 오버라이딩이 아니다.
오버로딩 vs 오버라이딩?
- 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentMethod() {}
}
class Child extends Parent {
void parentMethod() {} //오버라이딩
void parentMethod(int i) {} //오버로딩
void childMethod() {}
void childMethod(int i) {} //오버로딩
}
출처 : 자바의 정석
'Java' 카테고리의 다른 글
자바[JAVA] : final 키워드 (0) | 2021.01.28 |
---|---|
자바[JAVA] : 추상클래스 (0) | 2021.01.28 |
자바[JAVA] : super 키워드 (0) | 2021.01.28 |
자바[JAVA] : 상속의 특징 (0) | 2021.01.28 |
자바[JAVA]: 제곱과 제곱근(루트) 구하기 Math.pow() // Math.sqrt() (0) | 2020.12.02 |