스터디/이펙티브 자바

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

📝 작성 : 2022.07.03  ⏱ 수정 : 
728x90

@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 애너테이션을 다는 것이 좋습니다.

반응형