Item40. @Override annotation을 일관되게 사용하라

2022-01-14 23:24:07
#Java#Effective Java 3/E

@Override

Java가 기본으로 제공하는 annotation중 @Override는 상위 타입 method를 재정의하였을때 달릴 수 있다.

@Override annotation을 사용함으로 여러 가지 버그들을 컴파일 시점에 예방해 줄 수 있다.

예를 들어 다음과 같은 영어 알파벳 2개로 구성된 문자열을 표현하는 클래스가 있다고 할때, main method에서 26개의 소문자를 set에 넣어준뒤 출력하면 당연히 26개의 size가 출력되야하지만 실제로는 260 개의 size가 나온다.

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 o) {
        return first == o.first && second == o.second;
    }
    public int hashCode() {
        return Objects.hash(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()); // 260 
    }
}

그 이유는 바로 equals 메소드를 실수로 parameter를 Bigram 타입으로 받아 overloading하였기 때문이다. @Override 를 붙여주면 바로 compile error를 보여준다.

따라서 상위 class의 method를 재정의하는 모든 method는 @Override annotation을 달 것을 권고한다.

추가로 구체 class에서 상위 추상 class의 추상 메소드를 재정의하는 상황에서 개발자가 실수로 메소드 overloading 시에는 어차피 컴파일 에러가 터지기에 @Override annotation을 안 달아도 되지만, 일관성을 위해서 달아도 무관하다.

프로필 이미지
@chani
바둑, 스타크래프트 등 고전 게임을 좋아하는 내향인 개발자입니다

댓글