반응형
중복을 제거한 set을 사용?
package Rule36;
import java.util.HashSet;
import java.util.Set;
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<Bigram>();
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());
}
}
}
결과
260
· Bigram클래스에서 Equals, HashCode를 재정의 하였지만 Equals는 재정의 대신 오버로딩됨.
· 인자의 자료형을 Object로 해야한다.
· Bigram 객체는 집합 s에 추가될 때 새롭게 만들어지므로 전부 다른 객체로 인식하게 된다.
· 따라서 재정의 할 때는 Override어노테이션을 써야 한다.
@Override
public boolean equals(Object o) {
if(!(o instanceof Bigram)) {
return false;
}
Bigram b = (Bigram)o;
return b.first == first && b.second == second;
}
결과
26
결론
· 상위 자료형에 선언된 메서드를 재정의하는 모든 메서드에 Override 어노테이션을 붙이도록 하면 굉장히 많은 오류를 막을 수 있다.
· abstract가 아닌 클래스에서 상위 클래스의 abstract메서드를 재정의 할 때는 Override 어노테이션을 붙이지 않아도 된다.
· 추상클래스나 인터페이스에서 상위 인터페이스 메서드를 재정의 하는 모든 메서드에 abstract 메서드건 아니건 상관없이 Override어노테이션을 붙일 필요가 있다.
· set인터페이스는 collection인터페이스에 선언된 메서드에 어떤 새로운 메서드도 더하지 않았으므로 실수로 collection인터페이스에 새로운 메서드를 더하는 일을 막기 위함.
반응형
'IT > Programming' 카테고리의 다른 글
<Effective Java> RULE 34 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라 (0) | 2023.04.27 |
---|---|
<Effective Java> RULE 35 작명 패턴 대신 어노테이션을 사용하라 (0) | 2023.04.27 |
<Effective Java> RULE 37 자료형을 정의할 때 표식 인터페이스를 사용하라 (0) | 2023.04.27 |
<Effective Java> RULE 38 인자의 유효성을 검사하라 (0) | 2023.04.27 |
<Effective Java> RULE 39 필요하다면 방어적 복사본을 만들라. (0) | 2023.04.27 |