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