본문 바로가기

개발이야기/Effective Java

[Effective Java]Override 어노테이션은 일관되게 사용하라


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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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());
    }
}
cs

위와 같은 코드는 알파벳 두 개로 구생된 Bigram 객체 26개를 반복해서 집합에 넣는 작업을 수행한다.
Bigram 클래스의 프로그래머는 equals 메서드를 super class인 Object class로 부터 재정의 되지 못하고 Overloading 되었다는 것을 알 수 있다.

1
2
3
4
    @Override
    public boolean equals(Bigram b){
        return b.first == first && b.second == second;
    }
cs

만약 원래 의도대로 equals를 재정의 한다는 표시로 @Override 어노테이션을 위 코드와 같이 붙이면 어떻게 될까?

1
2
3
Bigram.java:10: method does not override or implement a method from a supetype
    @Override
    ^ 
cs

위 처럼 컴파일 오류가 나타난다. 
이처럼 Override를 의도했다면 해당 어노테이션을 붙여서 사전에 에러를 방지할 수 있다.

최신 IDE가 가지고 있는 코드 인스펙션(code inspection)을 통해 컴파일 전에도 에러를 알아차릴 수 있게 된다.


요약 : super class에 선언된 메서드를 재정의(Override)하는 모든 메서드에 Override 어노테이션을 붙이도록 하면 굉장히 많은 오류를 막을 수 있다.