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

대연.

·

2021. 3. 28. 17:56

728x90

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을 꼭 달도록 하자.

0개의 댓글