재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다. 예외는 한 가지 뿐이다. 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다.(단다고 해서 해로울 것도 없다)
package effectivejava.chapter6.item40; import java.util.*; public 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(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * first + second; } 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를 붙이지 않아서 main의 로직에서 260개의 데이터가 들어갔다고 나오게 됨.
- Object 의 메서드인 equals를 Override하지 않고 Overloading하게 된 상황
- 파라미터의 타입도 Object가 아니라 Bigram이어서