오버라이딩이란?
- 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것
- 부모 클래스의 메서드 선언부와 같아야 한다.
- 오버라이딩하면 기존과 다른 기능으로 구현할 수 있다.
- 자동 타입 변환되면 부모 클래스나 인터페이스의 메서드가 호출되지만, 오버라이딩된 메서드가 있으면 오버라이딩된 메서드가 호출된다.
@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 ⭕️
어노테이션을 기재하면 컴파일 시 다음과 같이 오류가 발생한다.
결론
- 어노테이션을 붙여 컴파일 시 강력한 체크를 하자.
- 인지하지 못한 상태에서 의도치 않은 실행이라니.. 상상만 해도 식은땀 난다.