HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📖
공부한 책
/
📒
Effective Java
/
아이템 40 : @Override 애너테이션을 일관되게 사용하라

아이템 40 : @Override 애너테이션을 일관되게 사용하라

💡
재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을 때 컴파일러가 바로 알려줄 것이다. 예외는 한 가지 뿐이다. 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다.(단다고 해서 해로울 것도 없다)
package effectivejava.chapter6.item40; import java.util.*; 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()); } }
코드 40-1 영어 알파벳 2개로 구성된 문자열(바이그램)을 표현하는 클래스 - 버그를 찾아보자. (246쪽)
  • 위의 코드를 살펴 보면 equals 메서드에 @Override를 붙이지 않아서 main의 로직에서 260개의 데이터가 들어갔다고 나오게 됨.
  • Object 의 메서드인 equals를 Override하지 않고 Overloading하게 된 상황
    • 파라미터의 타입도 Object가 아니라 Bigram이어서