[Java] 오버라이딩과 @Override

오버라이딩이란?

  • 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것
    • 부모 클래스의 메서드 선언부와 같아야 한다.
  • 오버라이딩하면 기존과 다른 기능으로 구현할 수 있다.
  • 자동 타입 변환되면 부모 클래스나 인터페이스의 메서드가 호출되지만, 오버라이딩된 메서드가 있으면 오버라이딩된 메서드가 호출된다.

@Override 기재는 필수일까?

  • 컴파일 시 강력한 체크를 위해 어노테이션을 기재하는 게 좋다고 생각한다.
  • 하지만 어노테이션을 기재하지 않아도 코드는 실행된다.
    • 코드 상 오류가 있을 때, 컴파일 에러 없이 의도와 다르게 실행되는 건 함정...😨

코드로 살펴보기

  • @Override ❌

    • 아래 예시의 본래 의도는 Child 클래스의 오버라이딩한 hello()를 호출하는 것이다. 하지만 매개 변수 String name의 누락으로 오버라이딩되지 않았다.

    • 오버라이딩되지 않은 Child 클래스의 hello()는 호출되지 않고, 개발자의 의도와 달리 Parent 클래스의 hello()가 호출된다.

    • 컴파일 에러가 발생하지 않아 오버라이딩되지 않은 것을 개발자가 인지하지 못할 가능성이 크고, 의도와 다른 로직의 실행으로 큰 문제가 발생할 수 있다.

              class Parent {
                public void hello(String name) {
                  System.out.println("안녕하세요, 저는 " + name + "입니다.");
                }
              }
      
              class Child extends Parent{
              //     @Override
                public void hello() {
                  System.out.println("안녕!");
                }
              }
      
              class AnnotationTest {
                public static void main(String[] args) {
                  Parent parent = new Parent();
                  parent.hello("부모");
      
                  Parent child = new Child();
                  child.hello("오버라이딩한 자식메서드를 쓰고 싶은데 부모가 쓰인다롱");
                }
              }

  • @Override ⭕️

    • 어노테이션을 기재하면 컴파일 시 다음과 같이 오류가 발생한다.

결론

  • 어노테이션을 붙여 컴파일 시 강력한 체크를 하자.
  • 인지하지 못한 상태에서 의도치 않은 실행이라니.. 상상만 해도 식은땀 난다.