Item 40. @Override

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

μžλ°”κ°€ 기본으둜 μ œκ³΅ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜ 쀑 κ°€μž₯ μ€‘μš”ν•˜κ³  자주 μ“°μ΄λŠ” μ• λ„ˆν…Œμ΄μ…˜μ€ @Override이닀. @OverrideλŠ” ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œ κ²ƒμž„μ„ ν‘œμ‹œν•˜λŠ” λ©”μ„œλ“œλ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” μ• λ„ˆν…Œμ΄μ…˜μ΄λ‹€.

이 μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ°, κ·Έ μ˜ˆλŠ” μ•„λž˜ μ½”λ“œμ™€ κ°™λ‹€.

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) { // Object의 equalsλ₯Ό μž¬μ •μ˜ν•˜κΈ° μœ„ν•΄μ„  λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ Object둜 해야함
        return b.first == first && b.second == second;
    }

    public int hashCode() {
        return 31 * first + second;
    }
}

class Main {
    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)); // μ „λΆ€ λ‹€λ₯Έ Bigram 객체둜 μΈμ‹ν•˜μ—¬ 총 26 * 10 = 260개의 객체가 생성됨
            }
        }
        System.out.println(s.size()); // κΈ°λŒ€ν•˜λŠ” κ°’ 26, μ‹€μ œ κ°’ 260
    }
}

μ–Έλœ» 보면 문제 없이 equals λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œ κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, μ‹€μ œλ‘œλŠ” Object의 equals λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜(overriding)ν•œ 것이 μ•„λ‹ˆλΌ 닀쀑 μ •μ˜(overloading)ν•œ 것이닀. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„  Object.equalsλ₯Ό μž¬μ •μ˜ν•œλ‹€λŠ” μ˜λ„λ₯Ό λͺ…ν™•νžˆ 밝히기 μœ„ν•΄ @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

class Bigram {
    private final char first;
    private final char second;

    public Bigram(char first, char second) {
        this.first = first;
        this.second = second;
    }

//    Error, method does not override or implement a method from a supertype
//    @Override
//    public boolean equals(Bigram b) {
//        return b.first == first && b.second == second;
//    }

    @Override
    public boolean equals(Object o) { // Object의 equalsλ₯Ό μž¬μ •μ˜ν•˜κΈ° μœ„ν•΄μ„  λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ Object둜 해야함
        if (!(o instanceof Bigram)) {
            return false;
        }
        Bigram b = (Bigram) o;
        return b.first == first && b.second == second;
    }

    @Override
    public int hashCode() {
        return 31 * first + second;
    }
}

λ§Œμ•½ 기쑴의 λ©”μ„œλ“œμ— @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κΈ° λ•Œλ¬Έμ— ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ‹€μˆ˜λ₯Ό 빨리 λ°œκ²¬ν•  수 μžˆλ‹€.

κ²°λ‘ 

기본적으둜 μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ €λŠ” λͺ¨λ“  λ©”μ„œλ“œμ— @Overrideλ₯Ό μ‚¬μš©ν•˜μž. μ˜ˆμ™Έλ‘œ μƒμœ„ 클래슀의 좔상 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•œ ꡬ상 ν΄λž˜μŠ€λŠ” @Overrideλ₯Ό μƒλž΅ν•΄λ„ λ˜λŠ”λ°, μ΄λŠ” 좔상 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κΈ° λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ 뢙인닀고 λ¬Έμ œκ°€ λ˜λŠ” 것이 μ•„λ‹ˆλ‹ˆ μž¬μ •μ˜ ν•˜λŠ” κ²½μš°μ—” 항상 @Overrideλ₯Ό λΆ™μ΄λŠ” 것이 μ’‹λ‹€.

Last updated

Was this helpful?