Java

Java Overriding

donggi 2022. 8. 30. 11:01
백기선 자바 스터디 6주차 상속 주제에 대해 학습하면서 정리한 내용입니다.

메서드 오버라이딩


오버라이딩이란

Java의 오버라이딩은 조상 클래스로부터 상속받은 메서드의 내용을 재정의합니다. 상속받은 메서드를 그대로 사용할 수 있지만, 자손 클래스 자신에 맞게 변경해야하는 경우 오버라이딩하게 됩니다.

오버라이딩 조건

오버라이딩은 메서드의 내용만 새로 작성하는 것이므로 메서드 선언부는 조상 클래스에서 정의한 것과 동일해야 합니다.

오버라이딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 메서드 이름
  • 매개변수
  • 반환 타입

이 세가지 조건을 만족해야 오버라이딩이 가능한 조건이 성립하게 됩니다.

세 가지 조건은 선언부에 속하는 부분인데 이 때 접근 제어자와 예외는 제한된 조건 하에서 다르게 변경할 수 있습니다.

또한 자손 클래스에서 오버라이딩된 메서드에서 조상 클래스에서 오버라이딩하려는 메서드를 호출 할 수 있습니다.

 

접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다

  • 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가 protected이거나 public이어야 합니다.
  • 접근 제어자의 접근 범위를 넓은 것에서 좁은 것 순으로 나열하면 public protected default private 순서가 됩니다.

오버라이딩과 예외

오버라이딩과 관련하여 예외 처리를 할 때 주의할 두 가지가 있습니다.

조상 클래스에서 오버라이딩 메서드가 예외를 던지고 있지 않을 때, 자손 클래스의 오버라이딩 메서드는 unchecked exception만 던질 수 있습니다.

  • checked exception을 던지고자 한다면 compile-time error가 발생하게 됩니다.

조상 클래스의 오버라이딩 메서드가 예외를 던지고 있다면, 자손 클래스의 재정의된 오버라이딩 메서드는 조상 클래스의 오버라이딩 메서드가 던지는 예외와 동일하거나 하위 클래스의 예외만 던질 수 있습니다.

  • 이보다 상위 계층의 예외를 던지면 컴파일 오류가 발생합니다.
  • 동일하거나 하위 계층 클래스 예외만 던질 수 있습니다.
  • 또한 하위 클래스 오버라이딩 메서드가 예외를 발생시키지 않아도 됩니다.

오버라이딩과 추상 메서드

인터페이스, 추상 클래스의 추상 메서드는 구현 클래스에서 오버라이딩(재정의) 해주어야합니다. 그러지 않으면 compile-time error가 발생하게 됩니다.

 

이 외에 특정한 경우 자손 클래스에서 오버라이딩 할 수 없습니다.

final 키워드가 붙은 메서드는 오버라이딩 할 수 없다

조상 클래스에서 메서드를 정의할 때 final 키워드를 붙였다면 해당 메서드는 자손 클래스에서 오버라이딩 할 수 없습니다.

private 접근 제어자를 가진 메서드는 오버라이딩 할 수 없다

private 접근 제어자를 가진 메서드는 자손 클래스에서 오버라이딩 할 수 없습니다.

static 메서드는 오버라이딩 아닌 method hiding이다

오버라이딩 조건이 갖춰진 static 메서드를 자손 클래스에서 정의하면 이는 오버라이딩이 아닌 method hiding이 됩니다.

조상 클래스에 정의된 static 메서드를 오버라이딩을 통해 재정의하는게 아닌 자손 클래스에서 하나의 static 메서드를 새로이 정의하는 것처럼 동작하게 됩니다.

 

정리해보자면 오버라이딩을 할 땐

  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없습니다.
  • 예외는 조상 클래스의 메서드보다 상위 계층의 예외를 던질 수 없습니다.
  • 인스턴스 메서드를 static 메서드로 혹은 그 반대로 변경할 수 없습니다.

 

References


자바의 정석 chapter 7

 

 

'Java' 카테고리의 다른 글

예외 처리  (0) 2022.09.15
Java의 Dynamic Method Dispatch, Abstract class, final, Object class  (0) 2022.09.01
Java의 상속과 super 키워드  (0) 2022.08.29
5주차 클래스  (0) 2022.08.18
제어문  (0) 2022.08.12