item 40 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ•„μ΄ν…œ40 @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μΌκ΄€λ˜κ²Œ μ‚¬μš©ν•˜λΌ

  • μžλ°”κ°€ 기본으둜 μ œκ³΅ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜ 쀑 λ³΄ν†΅μ˜ ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ κ°€μž₯ μ€‘μš”ν•œ 것은 @Override일 것이닀. @OverrideλŠ” λ©”μ„œλ“œ μ„ μ–Έμ—λ§Œ 달 수 있으며, 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ λ‹¬λ Έλ‹€λŠ” 것은 μƒμœ„ νƒ€μž…μ˜ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν–ˆμŒμ„ λœ»ν•œλ‹€. 이 μ• λ„ˆν…Œμ΄μ…˜μ„ μΌκ΄€λ˜κ²Œ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ κ°€μ§€ μ•…λͺ… 높은 버그듀을 μ˜ˆλ°©ν•΄μ€€λ‹€.

Bigram 이 μ •μƒλ™μž‘ν• κΉŒ?

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());
    }
}
  • main λ©”μ„œλ“œλ₯Ό 보면 λ˜‘κ°™μ€ μ†Œλ¬Έμž 2개둜 κ΅¬μ„±λœ λ°”μ΄κ·Έλž¨ 26개λ₯Ό 10번 λ°˜λ³΅ν•΄ 집합에 μΆ”κ°€ν•œ λ‹€μŒ, κ·Έ μ§‘ν•©μ˜ 크기λ₯Ό 좜λ ₯ν•œλ‹€. Set은 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ‹ˆ 26이 좜λ ₯될 κ±° κ°™μ§€λ§Œ, μ‹€μ œλ‘œλŠ” 260이 좜λ ₯λœλ‹€. 무언가 잘λͺ»λλ‹€!

μ™œ???

  1. ν™•μ‹€νžˆ Bigram μž‘μ„±μžλŠ” equals λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ € ν•œ κ²ƒμœΌλ‘œ 보이고 hashCode도 ν•¨κ»˜ μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 μžŠμ§€ μ•Šμ•˜λ‹€.
  2. 그런데 μ•ˆνƒ€κΉκ²Œλ„ equalsλ₯Ό β€˜μž¬μ •μ˜(overriding)β€™ν•œ 게 μ•„λ‹ˆλΌ β€˜λ‹€μ€‘μ •μ˜ (overloading)’해버렸닀.
  3. Object의 equalsλ₯Ό μž¬μ •μ˜ν•˜λ €λ©΄ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ Object둜 ν•΄μ•Όλ§Œ ν•˜λŠ”λ°, κ·Έλ ‡κ²Œ ν•˜μ§€ μ•Šμ€ 것이닀.
  4. κ·Έλž˜μ„œ Objectμ—μ„œ μƒμ†ν•œ equalsμ™€λŠ” λ³„κ°œμΈ equalsλ₯Ό μƒˆλ‘œ μ •μ˜ν•œ 꼴이 λ˜μ—ˆλ‹€. Object의 equals λŠ” == μ—°μ‚°μžμ™€ λ˜‘κ°™μ΄ 객체 식별성(identity)λ§Œμ„ ν™•μΈν•œλ‹€.
  5. λ”°λΌμ„œ 같은 μ†Œλ¬Έμžλ₯Ό μ†Œμœ ν•œ λ°”μ΄κ·Έλž¨ 10개 각각이 μ„œλ‘œ λ‹€λ₯Έ 객체둜 μΈμ‹λ˜κ³ , κ²°κ΅­ 260을 좜λ ₯ν•œ 것이닀.

해결책은 @Override

@Override public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
}
  • μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ €λŠ” λͺ¨λ“  λ©”μ„œλ“œμ— @Override μ• λ„ˆν…Œμ΄μ…˜μ„ λ‹¬μž.
  • μ˜ˆμ™ΈλŠ” ν•œ 가지뿐이닀. ꡬ체 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀의 좔상 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  λ•ŒλŠ” ꡳ이 @Overrideλ₯Ό 달지 μ•Šμ•„λ„ λœλ‹€. ꡬ체 클래슀인데 아직 κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ 좔상 λ©”μ„œλ“œκ°€ 남아 μžˆλ‹€λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ κ·Έ 사싀을 λ°”λ‘œ μ•Œλ €μ£ΌκΈ° λ•Œλ¬Έμ΄λ‹€. λ¬Όλ‘  μž¬μ •μ˜ λ©”μ„œλ“œ λͺ¨λ‘μ— @Overrideλ₯Ό μΌκ΄„λ‘œ λΆ™μ—¬λ‘λŠ” 게 μ’‹μ•„ 보인닀면 κ·Έλž˜λ„ 상관없닀.
⚠️ **GitHub.com Fallback** ⚠️