Item 36. 어노테이션은 일관되게 사용하라

  • 어노테이션을 일관되게 사용하면 끔찍한 human error로 인한 버그들을 방지 할 수 있다.

  • 대부분의 프로그래머에게 가장 중요하게 쓰이는 것은 Override이다.

    • 메서드 선언부 사용, 상위 자료형에 정의된 메서드를 재정의한다는 사실 표현

    • 이 어노테이션 일관되게 사용하면 끔찍한 버그를 방지

  • 알파벳 두개로 구성된 Bigram 객체 26개를 반복해서 집합에 넣는 작업

    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;
        }
    
    //    @Override
    //    public boolean equals(Object o) {
    //        if(!(o instanceof  Bigram)) return false;
    //        Bigram b = (Bigram) o;
    //        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());
         }
     }
    
    • 26 번 반복이라 정상적이라면 26이 출력이지만, 모든 오브젝트가 다르게 인식되어 260개가 출력됨 (Set은 중복 허용하지 않음)

    • equals(Object b)가 아닌 equals(Bigram b)로 잘못 Override 함.

    • equals 메소드를 super class인 Object class로 부터 재정의하지 못하고 Overloading 됨.

    • 즉 해당 class는 Object의 equals가 계승 됨. Object의 equals은 둘이 같은 객체인지만 비교함. (같은 객체의 참조인지)

    • @Override주석을 equals 함수에 넣어주면 컴파일 에러 발생해서 실수 방지 가능 함

  • 따라서, 상위 클래스에 선언된 메서드를 재정의할 때는 반드시 선언부에 Override 어노테이션을 붙여야 한다.

  • 하지만 예외는 있는데, abstract 클래스에서 abstract 메소드를 재정의 할 때는 안 붙여도 된다. abstract 메소드는 재정의하지 않으면 컴파일러가 오류를 내주기 때문이지.

  • 어노테이션 검사 기능을 갖춘 최신 IDE를 잘 활용하는 것도 방법.

results matching ""

    No results matching ""