자바 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 인용.
'JAVA > Effective Java' 카테고리의 다른 글
메서드- 규칙 38 인자의 유효성을 검사하라. (0) | 2018.05.29 |
---|---|
어노테이션 - 규칙 37 자료형을 정의할 때 표식 인터페이스를 사용하라. (0) | 2018.05.29 |
Enum - 규칙 35 작명 패턴 대신 어노테이션을 사용하라. (0) | 2018.05.29 |
Enum - 규칙 34 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라. (0) | 2018.05.29 |
Enum - 규칙 33 ordinal을 배열 첨자로 사용하는 대신 EnumMap을 이용하라. (0) | 2018.05.29 |