[Effective Java 3/E] ITEM 40. @Override Annotation을 일관적으로 사용하기

    Effective Java 표지. Source : https://blog.insightbook.co.kr/

    *알림 : *
    Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.

    해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
    https://github.com/kjsu0209/JavaBook
    https://medium.com/javabook

     

    JavaBook – Medium

    Documentation space of our book study.

    medium.com

     

    kjsu0209/JavaBook

    책읽기 스터디. Contribute to kjsu0209/JavaBook development by creating an account on GitHub.

    github.com

    앞서 ITEM 10이나 ITEM 11에서 살펴본 바와 같이, HashSet은 두 인스턴스의 동일성 판단을 위해 equals()hashSet()을 호출한다. 그러나 메서드 시그니쳐를 바르게 작성하지 않는다면 필요에 의해 Overriding 하려는 목적일지라도 Overloading이 되어바린다.

     

     

    예제 1 : 영어 알파벳 2개로 구성된 문자열을 표현하는 클래스

    
    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());
        }
    }

    Set s의 사이즈는 26이 될 것 같지만 260을 출력한다.

    문제는 equals를 Overloading한 데에 있다. Object 클래스의 equals는 파라미터에 Object를 가져간다. 컴파일러는 이를 Overloading으로 인식하기 때문에 별도의 컴파일 에러 없이 실행시키게 된다.

    그러나 @Override annotation을 작성하면 컴파일러는 아래와 같은 오류를 띄운다.

     

    Bigram.java:10 : method does not override or implement a method from a supertype (이하 생략..)

     

    @Override 를 작성하는 것 만으로 런타임에 잘못 동작하는 프로그램을 디버깅하는 노력을 들이는 것 대신 컴파일 타임에 프로그래머가 문제를 인식하고 고치게 된다.

     

    그러니 상위 클래스의 메서드를 재정의할 때, @Override annotation을 꼭 달도록 하자.

    댓글