Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 메서드 오버라이딩(재정의) 규칙 완벽 정리

메서드 오버라이딩(Method Overriding)은 상속 관계에 있는 클래스에서 슈퍼클래스의 메서드를 서브클래스가 자신에 맞게 다시 정의하는 객체지향 프로그래밍의 핵심 기능입니다. 하지만 아무렇게나 재정의할 수는 없으며, 컴파일러가 정상적으로 인식하고 다형성이 올바르게 동작하려면 반드시 지켜야 할 규칙들이 있습니다.

Java 메서드 재정의 시 반드시 지켜야 할 규칙

1. 메서드 시그니처와 반환 타입

  • 매개변수 목록 일치: 오버라이딩하는 메서드의 매개변수 목록은 슈퍼클래스에서 재정의 대상이 되는 메서드와 정확히 동일해야 합니다.
  • 반환 타입 규칙: 반환 타입은 슈퍼클래스 원본 메서드에서 선언된 반환 타입과 같거나, 그 하위 타입(subtype)이어야 합니다. 이를 공변 반환 타입(covariant return type)이라고 부릅니다.

2. 접근 제어자 관련 규칙

  • 접근 수준 축소 불가: 오버라이딩 메서드의 접근 수준은 원본 메서드보다 더 좁게 설정할 수 없습니다. 예를 들어 슈퍼클래스의 메서드가 public으로 선언되었다면, 서브클래스에서 이를 private이나 protected로 재정의할 수 없습니다.

3. 상속과 재정의 가능 여부

  • 인스턴스 메서드: 인스턴스 메서드는 서브클래스에 상속된 경우에만 재정의할 수 있습니다.
  • final 메서드: final로 선언된 메서드는 재정의할 수 없습니다.
  • static 메서드: static으로 선언된 메서드는 재정의할 수 없지만, 서브클래스에서 동일한 시그니처로 다시 선언(re-declare)하는 것은 가능합니다. 단, 이 경우 다형성이 아닌 참조 변수 타입 기준으로 호출됩니다.
  • 상속 불가능한 메서드: 애초에 상속될 수 없는 메서드는 재정의도 불가능합니다.

4. 패키지에 따른 재정의 범위

  • 같은 패키지 내 서브클래스: 슈퍼클래스와 같은 패키지에 속한 서브클래스는 private 또는 final로 선언되지 않은 모든 슈퍼클래스 메서드를 재정의할 수 있습니다.
  • 다른 패키지의 서브클래스: 다른 패키지에 있는 서브클래스는 public 또는 protected로 선언된 non-final 메서드만 재정의할 수 있습니다.

5. 예외 처리 규칙

  • 비검사 예외(unchecked exception): 오버라이딩 메서드는 원본 메서드가 예외를 던지는지 여부와 상관없이 임의의 비검사 예외(RuntimeException 계열)를 던질 수 있습니다.
  • 검사 예외(checked exception): 오버라이딩 메서드는 원본 메서드가 선언한 것보다 새로운 검사 예외를 던지거나, 더 넓은 범위의 검사 예외를 던져서는 안 됩니다. 다만 더 좁은 범위의 예외나 더 적은 수의 예외를 던지는 것은 허용됩니다.

6. 생성자는 재정의 불가

  • 생성자(Constructor): 생성자는 상속되지 않기 때문에 재정의할 수 없습니다. 서브클래스에서 이름이 같은 메서드를 만들더라도 이는 단순히 별개의 메서드로 취급됩니다.

정리

메서드 오버라이딩을 올바르게 활용하면 코드의 유연성과 확장성이 크게 향상됩니다. 핵심은 메서드 시그니처의 일치, 접근 제어자 축소 금지, final·static·생성자 재정의 불가, 그리고 예외 선언 범위 준수입니다. 이 규칙들을 숙지하면 다형성을 안정적으로 구현하고 예기치 않은 컴파일 오류나 런타임 문제를 예방할 수 있습니다.