맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 40. @Override 애너테이션을 일관되게 사용하라

안도일 2023. 6. 30. 21:42
@Override 애너테이션의 장점

 

아래 코드는 어떤 문제가 있을까?

 

 

중복을 허용하지 않는 Set에 26개의 소문자를 10번 반복해 추가했으니 집합의 크기는 26이 출력되어야 하지만 260이 출력된다.

 

  • 해당 equals는 재정의(overriding)한것이 아니라 다중정의(overloading) 한 것이다.
  • Object의 equals를 재정의하려면 매개변수 타입을 Object로 해야 하는데 그렇지 않아서 별개인 equals를 새로 정의한 것이 되었다.
  • Object의 equals는 == 연산자처럼 객체 식별성만을 확인하여 같은 문자를 소유한 바이그램 10개가 각각 서로 다른 객체로 인식되어 260을 출력한 것이다.

 

여기서 만약 @Override를 달았다면 컴파일러가 해당 오류를 찾아내주었을 것이다.

 

 

이렇게 수정 가능

 

그러니까 앞으로 재정의한 메서드에 @Override 애너테이션을 의식적으로 달면 실수했을 때 컴파일러가 알려줄 것이다.

 

 

 

예외

 

아래처럼 구체 클래스에서 상위 클래스의 추상 메서드를 재정의할 때는 굳이 @Override를 달지 않아도 된다.

 

 

구체 클래스임에도 아직 구현하지 않은 추상 메서드가 남아있다면 컴파일러가 바로 알려주기 때문에 @Override를 달아도 새로울 것이 없다.

 

 

결론

 

  • 상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달자.
  • 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우에는 달거나 말거나 상관없다.