IT/Programming / / 2023. 4. 27. 09:20

<Effective Java> RULE 36 Override 어노테이션은 일관되게 사용하라

반응형

 

중복을 제거한 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인터페이스에 새로운 메서드를 더하는 일을 막기 위함.

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유