*알림 : *
Effective Java 3판은 Java 9까지 도입된 언어적 기능을 중심으로 서술되어 있습니다. 10버젼 이후의 Java 개발을 하시는 분들은 우회적인 접근법 대신 Java 언어 내 새로 도입된 기능이 더 간결하고 좋을 수 있습니다.해당 포스팅은 SSAFY 내 책읽기 스터디의 활동을 통해 작성된 포스팅입니다.
https://github.com/kjsu0209/JavaBook
https://medium.com/javabook
앞서 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을 꼭 달도록 하자.
'IT > Effective Java' 카테고리의 다른 글
[Effective Java 3/E] ITEM 42. 익명 클래스보다는 람다를 사용하라 (0) | 2021.04.14 |
---|---|
[Effective Java 3/E] ITEM 41. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라 (0) | 2021.03.28 |
[Effective Java 3/E] ITEM 39. 명명 패턴보다 애너테이션을 사용하라 (0) | 2021.03.28 |
[Effective Java 3/E] ITEM 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라. (0) | 2021.03.28 |
[Effective Java 3/E] ITEM 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2021.03.28 |
댓글