본문 바로가기
Develop/Java

메서드 오버라이딩(Overriding)

by 준팍(junpak) 2023. 4. 4.

우린 부모님 말을 잘 듣기도 하지만, 때로는 새롭게 정의해서 듣기도 한다.

자바에서도 마찬가지이다.

부모 클래스가 이미 정의한 메소드를 자식 클래스가 같은 시그니쳐를 유지한 채,

새로운 메서드로 다시 정의하는 경우를 보곤한다.

우리는 이것을 “메서드 오버라이딩”이라고 부른다.

메서드 오버라이딩의 정의

  • 조상클래스로부터 상속받은 메서드의 내용을 변경하는 것

메서드 오버라이딩의 장점

  • 자식 클래스가 부모클래스와 다르게 동작하길 바라는 경우, 필요한 동작을 재정의할 수 있다.

메서드 오버라이딩의 조건

  • 메서드의 이름이 같아야한다
  • 매개변수가 같아야한다
  • 반환타입이 같아야한다

→ 즉, 시그니쳐(선언부)가 같아야한다. 왜냐하면 오버라이딩은 메소드의 동작만을 재정의하는 것이기 때문이다.

메서드 오버라이딩의 주의사항

  • 접근 제어자를 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
    • 단순히 선언된 예외 개수의 문제가 아니다. Exception의 경우 모든 예외의 최고 조상이므로, 부모 클래스가 구체적인 예외를 선언했다면 자식 클래스에서 Exception을 사용할 수 없다.
  • 인스턴스 메서드를 static 메서드로 변경할 수 없다.
  • static 메서드를 인스턴스 메서드로 변경할 수 없다.

@Override 애너테이션

  • 자바가 기본으로 제공하는 애너테이션
  • 상위 타입의 메서드를 재정의했음을 의미
  • @Override 애너테이션을 단 경우, 컴파일러가 잘못된 부분을 명확히 알려준다.
  • 구체 클래스가 상위 클래스의 추상 메서드를 재정의할 때는 굳이 달아주지 않아도 되지만, 코드의 일관성을 위해 재정의한 메서드 모두에 @Override를 붙여두는 것도 괜찮다.
  • 인터페이스의 메서드를 재정의할 때도 사용 가능하다.
    • 인터페이스가 디폴트 메서드를 지원하기 시작하면서, 디폴트 메서드를 재정의하려고 하는 건 아닌지 확인할 수 있는 방법이 되었다.

오버로딩 vs 오버 라이딩

오버로딩과 오버라이딩은 단어의 유사성으로 인해 혼동하는 경우가 발생한다.

그러나 개념도, 사용처도 명확하게 다르다.

  • 오버로딩
    • 기존에 없는 새로운 메서드를 정의하는 것
    • 상속 관계와 상관 없이 한 클래스 내부에서 일어나는 일이다.
  • 오버라이딩
    • 상속받은 메서드의 내용을 변경하는 것
    • 부모 클래스의 상속 혹은 인터페이스의 구현 시 일어나는 일이다.

레퍼런스

'Develop > Java' 카테고리의 다른 글

추상 클래스와 인터페이스  (0) 2023.04.04
다형성  (0) 2023.04.04
제어자  (0) 2023.04.04
메서드 오버로딩 (Overloading)  (0) 2023.04.03
클래스와 인스턴스  (0) 2023.04.03