어노테이션 - 규칙 36 Override 어노테이션은 일관되게 사용하라.
JAVA/Effective Java

어노테이션 - 규칙 36 Override 어노테이션은 일관되게 사용하라.

반응형

자바 1.5에 어노테이션이 추가되었을 때, 자바 기본 라이브러리에 몇 가지 어노테이션 자료형이 추가되었다. 

그 중 대표적인 어노테이션 @Override이다.
@Override 어노테이션은 메서드 선언부에서만 사용할 수 있고, 부모 자료형에 선언된 메서드를 재정의 할 때 사용한다.

만약 메서드를 재정의 할 때 @Override 어노테이션을 입력하지 않으면 다음과 같은 문제가 발생할 수 있다.



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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package effective36;
 
import java.util.Objects;
 
/**
 * Stdudent class
 * 
 * @author wedul
 *
 */
public class Student {
    private String name;
    private char sex;
    
    public Student(String name, char sex) {
        this.name = name;
        this.sex = sex;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getSex() {
        return sex;
    }
 
    public void setSex(char sex) {
        this.sex = sex;
    }
    
    public int hashCode() {
        return Objects.hash(this.name, this.sex);
    }
    
    public boolean equals(Student stu) {
        return Objects.equals(this.name, stu.getName()) && Objects.equals(this.sex, stu.getSex());
    }
 
}
 
 
package effective36;
 
import java.util.HashSet;
import java.util.Set;
 
public class Main {
    public static void main(String args[]) {
        Set<Student> datas = new HashSet<>();
        
        for (int i = 0; i < 10; i++ ) {
            datas.add(new Student("wedul"'M'));
        }
        
        System.out.println(datas.size());
    }
}
cs



학생을 담고 있는 student 클래스의 보면 equals와 hashcode를 모두 재정의 하였다.
Main 클래스에서 이런 Student클래스를 10개를 만들어서 동일한 데이터의 중복 방지를 지원하는 Set에 삽입해 보았다. 그리고 그 Set의 길이를 확인해 보았는데 예상외로 10으로 나온다.

그 이유는 무엇일까?

사실 Object의 equals 메소드를 살펴보면 다음과 같이 되어있다.





그렇기 때문에 위에서 우리가 선언했던 equals는 public boolean equals(Student stu)이기 때문에 오버라이딩이 아니라 오버로딩이 되어버렸다.

그래서 이를 방지하기 위해서 @Override 어노테이션을 붙어주어야 한다. 
그러면 컴파일러에서 정상적으로 재정의가 되었는지 확인을 해준다.





하지만 꼭 붙히지 않는 경우가 있다. abstract 클래스나, interface를 상속하거나 구현하는 경우에는 어차피 컴파일러에서 경고를 주기 때문이다.

하지만 그래도 습관적으로 오류를 방지하기 위해서 붙혀주는 것이 좋다.


출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙36 인용.

반응형