@Override 애너테이션의 장점
아래 코드는 어떤 문제가 있을까?
중복을 허용하지 않는 Set에 26개의 소문자를 10번 반복해 추가했으니 집합의 크기는 26이 출력되어야 하지만 260이 출력된다.
- 해당 equals는 재정의(overriding)한것이 아니라 다중정의(overloading) 한 것이다.
- Object의 equals를 재정의하려면 매개변수 타입을 Object로 해야 하는데 그렇지 않아서 별개인 equals를 새로 정의한 것이 되었다.
- Object의 equals는 == 연산자처럼 객체 식별성만을 확인하여 같은 문자를 소유한 바이그램 10개가 각각 서로 다른 객체로 인식되어 260을 출력한 것이다.
여기서 만약 @Override를 달았다면 컴파일러가 해당 오류를 찾아내주었을 것이다.
이렇게 수정 가능
그러니까 앞으로 재정의한 메서드에 @Override 애너테이션을 의식적으로 달면 실수했을 때 컴파일러가 알려줄 것이다.
예외
아래처럼 구체 클래스에서 상위 클래스의 추상 메서드를 재정의할 때는 굳이 @Override를 달지 않아도 된다.
구체 클래스임에도 아직 구현하지 않은 추상 메서드가 남아있다면 컴파일러가 바로 알려주기 때문에 @Override를 달아도 새로울 것이 없다.
결론
- 상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달자.
- 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우에는 달거나 말거나 상관없다.
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 42. 익명 클래스보다는 람다를 사용하라 (0) | 2023.07.02 |
---|---|
[Effective Java] Item 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2023.06.30 |
[Effective Java] Item 39. 명명 패턴보다 애너테이션을 사용하라 (0) | 2023.06.30 |
[Effective Java] Item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 (0) | 2023.06.29 |
[Effective Java] Item 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2023.06.29 |