@Override
@Override
애너테이션은 메서드 선언에만 달 수 있으며, 해당 메서드가 상위 타입의 메서드를 재정의했다는 것을 알려줍니다.
붙이지 않아도 컴파일 오류가 나지 않지만 버그를 예방할 수 있기 때문에 사용하는 것이 좋습니다.
@Override를 사용하지 않으면?
public class MyClass {
private final int a;
public MyClass(int a) { this.a = a; }
public boolean equals(MyClass m) { return m.a == a; }
public int hashCode() { return a; }
public static void main(String[] args) {
Set<MyClass> set = new HashSet<>();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
set.add(new MyClass(j));
}
}
System.out.println("set.size() = " + set.size());
}
}
Output
set.size() = 100
Set
은 중복을 허용하지 않으므로 set의 size는 10이 나와야하지만 100이 나왔습니다. equals 메서드가 Overriding된 것이 아니라 Overloading이 되었기 때문입니다.
Object의 equals를 재정의하려면 매개변수 타입이 Object가 되어야 하는데 MyClass로 작성했기 때문입니다.@Override
애너테이션을 달았으면 컴파일 단계에서 오류를 확인할 수 있습니다.
정리
상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override
애너테이션을 다는 것이 좋습니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item42. 익명 클래스보다는 람다를 사용하라 (0) | 2022.07.03 |
---|---|
[Effective Java] Item41. 정의하려는 것이 타입이면 마커 인터페이스를 활용하라 (0) | 2022.07.03 |
[Effective Java] Item39. 명명 패턴보단 어노테이션 (0) | 2022.06.26 |
[Effective Java] Item38. 확장가능한 열거 타입이 필요하면 인터페이스 (0) | 2022.06.26 |
[Effective Java] Item 37. ordinal 인덱싱 대신 EnumMap (0) | 2022.06.26 |