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());
}
}
소문자 2개로 구성된 바이그램 26개를 10번 반복해서 set에 넣음
같은 객체에 대해서 중복이 제거되니 s의 사이즈가 26을 기대하지만 실제로는 260이 출력됨
원인
equels 는 Object 를 매개변수로 받음
Bigram 클래스의 eqauls 는 재정의(overriding)되지 않고 다중정의(overloading)되었음
이 경우 @Override 사용 시 컴파일 에러가 발생함
/Bigram.java:13: error: method does not override or implement a method from a supertype
@Override
^
1 error
핵심!
상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달자!
예외: 추상 클래스의 추상 메서드를 재정의할 때는 굳이 @Override를 달지 않아도 된다.
(구현하지 않은 추상 메서드가 남아 있다면 컴파일러가 알려주기 때문에)
기타
디폴트 메서드가 있는 인터페이스를 재구현시에 @Override 애너테이션을 사용하면 구현 메서드의 시그니처가 올바른지 체크할 수 있음
@Override
코드 40-1 예제 코드
s
의 사이즈가 26을 기대하지만 실제로는 260이 출력됨equels
는 Object 를 매개변수로 받음Bigram
클래스의eqauls
는 재정의(overriding)되지 않고 다중정의(overloading)되었음@Override
사용 시 컴파일 에러가 발생함핵심!
상위 클래스의 메서드를 재정의하려는 모든 메서드에
@Override
애너테이션을 달자!기타
@Override
애너테이션을 사용하면 구현 메서드의 시그니처가 올바른지 체크할 수 있음@Override
메서드를 달아주는게 좋음Set
인터페이스는Collection
인터페이스를 확장했지만 추가한 메서드가 없음Set
에서는 모든 메서드 선언에@Override
를 달아 실수로 추가한 메서드가 없음을 보장했음 (? 실제 코드보면 없음..)