들어가며 @Override 애너테이션은 매우 유용하다. 다음 코드를 보자. 1234567891011121314151617public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Biagram b) { return b.first == first && b.second == second); } public int hashCode() { return 31 * first + second; }} 이 클래스는 잘못된 equals를 정의하고 있다. Set과 같은 컬렉션에서 사용할 용도로 equals를 정의하였다면 말이다. @Override 애너테이션을 붙혔다면 금방 알아차릴 수 있었을 것이다. 메세지는 명백하다. 상위 클래스의 메소드를 재정의하려는 모든 메소드에 @Override 애너테이션을 달자. 단, 구체 클래스에서 상위 클래스의 추상 메소드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다.