아이템 40. @Override 어노테이션을 일관되게 사용하라. - ksw6169/effective-java GitHub Wiki

@Override를 일관되게 사용하면 여러 버그들을 예방할 수 있다.

@Override 를 일관되게 사용하면 컴파일 과정에서 메소드를 올바르게 재정의하였는지 확인할 수 있다.

public class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

    // 재정의(overriding) 하려 했으나 다중 정의(overloading) 하였다.
    public boolean equals(Bigram b) {
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }

    /**
     * 소문자 2개로 구성된 바이그램 26개를 10번 반복해 Set에 추가하고 이를 출력한다.
     * 중복을 허용하지 않으니 26이 출력될 것 같지만 실제로는 260이 출력된다.
     */
    public static void main(String[] args) {
        Set<Bigram> s = new HashSet<>();
        for (int i = 0; i < 10; i++)
            for (char ch = 'a'; ch <= 'z'; ch++)
                s.add(new Bigram(ch, ch));
        System.out.println(s.size());
    }
}

위 코드에서 본의 아니게 다중 정의한 equals() 를 올바르게 수정한다면 다음과 같다.

@Override
public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

결론

상위 클래스의 메소드를 재정의하려는 모든 메소드에 @Override 를 달자. 단, 구체 클래스에서 상위 클래스의 추상 메소드를 재정의한 경우에는 이 어노테이션을 달지 않아도 된다. (아직 구현하지 않은 추상 메소드가 남아 있다면 컴파일러가 이를 알려주기 때문이다.)


참고 자료

  • Effective Java 3/E
⚠️ **GitHub.com Fallback** ⚠️