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를 재정의한게 아니라 오버로딩 함
equals를 재정의하려면 매개변수 타입을 Object로 해야만 해야함
위 오류를 컴파일러가 찾아낼 수 있게 하기 위해 @Override 가 필요함
@Override
public boolean equals(Bigram b) {
return b.first == first && b.second == second;
}
⇒ 상위 클래스의 메서드를 재정의하려는 모든 메서드에는 @Override 애너테이션을 달자
구체 클래스에서 상위 클래스의 메서드를 재정의할 때
→ 구체 클래스인데 구현하지 않은 추상 메서드가 남아 있다면 컴파일러가 자동으로 사실을 알려주기 때문에 굳이 달지 않아도 됨
@Override
는 클래스 뿐만 아니라, 인터페이스의 메서드를 재정의 할 때도 사용할 수 있음
@Override
를 사용하면 시그니처가 올바른지 확인할 수 있음@Override
를 다는 것이 좋음
@Override
를 달아 실수로 추가한 메서드가 없음을 보장함