Item 11. hashCode

equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashCode๋„ ์žฌ์ •์˜ํ•˜๋ผ

์•„์ดํ…œ 10์—์„œ equals๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ hashCode๋„ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค. Object ๋ช…์„ธ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

  • equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด, hashCode ๋ฐ˜ํ™˜ ๊ฐ’๋„ ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•จ(์ผ๊ด€์„ฑ)

  • equals๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode๋Š” ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•จ

  • equals๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ•ด๋„, ๋‘ ๊ฐ์ฒด์˜ hashCode๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๋Š” ์—†์Œ(๋‹จ, ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง)

์žฌ์ •์˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฉด HashMap / HashSet ๊ฐ™์€ Hash ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์—์„œ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

hashCode ์žฌ์ •์˜ ๋ฐฉ๋ฒ•

์ข‹์€ hashCode๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์šฐ์„  ์ฃผ์˜ํ•ด์•ผํ•  ๋ถ€๋ถ„์€ equals์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•„๋“œ๋“ค๊ณผ ๋™์ผํ•œ ํ•„๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

  1. int ๋ณ€์ˆ˜ result๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’ c๋กœ ์ดˆ๊ธฐํ™”

  2. ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ฐ ํ•ต์‹ฌ ํ•„๋“œ์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•˜์—ฌ ํ•ด์‹œ์ฝ”๋“œ c๋ฅผ ๊ณ„์‚ฐ

    • ๊ธฐ๋ณธ ํƒ€์ž…: Type.hashCode(f) ์ˆ˜ํ–‰

    • ์ฐธ์กฐ ํƒ€์ž…: ์žฌ๊ท€์ ์œผ๋กœ hashCode๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ณ„์‚ฐ

      • null: 0

      • ๋ฐฐ์—ด: Arrays.hashCode๋ฅผ ์‚ฌ์šฉ

      • ํ•ต์‹ฌ ํ•„๋“œ: ํ•ต์‹ฌ ํ•„๋“œ์˜ hashCode๋ฅผ ์‚ฌ์šฉ

      • ํ•„๋“œ๊ฐ€ ํ•ต์‹ฌ์ด ์•„๋‹ˆ๋ฉด, ํ•ด๋‹น ํ•„๋“œ์˜ hashCode๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Œ

  3. ๊ณ„์‚ฐ๋œ ํ•ด์‹œ์ฝ”๋“œ c๋ฅผ result์— ๋”ํ•จ(result = 31 * result + c)

Objects ํด๋ž˜์Šค์—๋Š” ์ž„์˜์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ธ hash๊ฐ€ ์žˆ๋‹ค. ์œ„์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์—ฌ ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์ง€๋งŒ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๊ณฑ์…ˆ์— 31์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

ํ™€์ˆ˜์ด๋ฉด์„œ ์†Œ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์‚ฌ์‹ค ์†Œ์ˆ˜๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜์ง„ ์•Š๊ณ  ์ „ํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ง์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ •๋ณด๋ฅผ ์žƒ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ˆ˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.

์บ์‹ฑ

์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ณผ์ •์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„๋“œ์— ๊ฐ’์„ ์บ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ํ•„๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ถˆ๋ณ€ ํ•„๋“œ์—๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

class Test {
    private int hashCode;

    // ํ˜ธ์ถœํ•  ๋•Œ ์บ์‹ฑ๋˜๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™”(lazy initialization) ๊ธฐ๋ฒ• ์‚ฌ์šฉ
    @Override
    public int hashCode() {
        int result = hashCode;
        if (result == 0) {
            result = 31 * result + ...;
            hashCode = result;
        }
        return result;
    }
}

Last updated

Was this helpful?