아니요. 슈퍼 클래스의 메서드를 재정의(오버라이딩)할 때는 두 메서드가 반드시 동일한 이름, 동일한 매개변수, 동일한 반환 타입을 가져야 합니다. 이 조건 중 하나라도 다르면 두 메서드는 서로 다른 메서드로 취급됩니다.
시그니처를 변경하면 어떻게 될까?
간단히 말해, 메서드 시그니처를 변경하면 슈퍼 클래스의 메서드를 재정의할 수 없습니다. 재정의를 시도하더라도 실제로 실행되는 것은 슈퍼 클래스의 메서드입니다.
그 이유는 다음과 같습니다.
- 시그니처를 변경하는 순간 두 메서드는 이름만 같을 뿐, 자바 컴파일러 입장에서는 완전히 별개의 메서드로 간주됩니다. 즉, 이것은 오버라이딩이 아니라 오버로딩(overloading)에 해당합니다.
- 서브 클래스 객체에는 슈퍼 클래스 메서드의 복사본이 함께 포함되어 있기 때문에, 호출 시 해당 슈퍼 클래스 메서드가 실행됩니다.
예제 코드
class Super {
void sample(int a, int b) {
System.out.println("Method of the Super class");
}
}
public class MethodOverriding extends Super {
void sample(int a, float b) {
System.out.println("Method of the Sub class");
}
public static void main(String args[]) {
MethodOverriding obj = new MethodOverriding();
obj.sample(20, 20);
}
}
위 예제에서 서브 클래스의 sample(int a, float b) 메서드는 매개변수 타입이 슈퍼 클래스의 sample(int a, int b)와 다릅니다. 따라서 오버라이딩이 아니라 오버로딩으로 처리됩니다.
실행 결과
Method of the Super class
정수 값 20은 float보다 int 매개변수와 더 정확히 일치하기 때문에, 슈퍼 클래스의 메서드가 선택되어 실행된 것을 확인할 수 있습니다.
실수를 방지하는 팁: @Override 어노테이션
이런 실수를 미리 방지하려면 메서드 위에 @Override 어노테이션을 붙이는 것이 좋습니다. 이 어노테이션이 붙은 메서드가 실제로 슈퍼 클래스의 메서드를 재정의하지 않는다면, 컴파일러가 오류를 발생시켜 개발 단계에서 문제를 바로 잡을 수 있습니다.