Skip to content

Latest commit

ย 

History

History
466 lines (332 loc) ยท 19.8 KB

File metadata and controls

466 lines (332 loc) ยท 19.8 KB
description Overriding hashCode

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

equals๋ฅผ ์žฌ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” hashCode๋„ ์žฌ์ •์˜ ํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ HashMap์ด๋‚˜ HashSet ๊ฐ™์€ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1. hashCode ์ผ๋ฐ˜ ๊ทœ์•ฝ

โœ”๏ธ ์ผ๊ด€์„ฑ : equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, hashCode๋„ ๋ณ€ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค๋ฉด ์ด ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ๋„ ์ƒ๊ด€ ์—†์Œ)

โœ”๏ธ equals(Object)๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๊ฐ™๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค๋ฉด, ๋‘ ๊ฐ์ฒด์˜ hashCode๋Š” ๋˜‘๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

-> โญ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

โœ”๏ธ equals๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋”๋ผ๋„, hashCode๋Š” ๊ผญ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.

2. ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

equals๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐ์ฒด๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™๋‹ค๊ณ  ํ•  ๋•Œ, hashCode ๋ฉ”์„œ๋“œ๋Š” ์ด ๋‘˜์ด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฑฐ๋ผ๊ณ  ํŒ๋‹จ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Map<PhoneNumber, String> map = new HashMap<>();
map.put(new PhoneNumber(010,1234,5678), "๋ฆฌ์น˜");

์ด ์ฝ”๋“œ์— map.get(new PhoneNumber(010,1234,5678))๋ฅผ ์‹คํ–‰ํ•˜๋ฉด "๋ฆฌ์น˜"๊ฐ€ ์•„๋‹Œ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

PhoneNumber ํด๋ž˜์Šค๋Š” hashCode๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋…ผ๋ฆฌ์  ๋™์น˜์ธ ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ get ๋ฉ”์„œ๋“œ๋Š” ์—‰๋šฑํ•œ ํ•ด์‹œ ๋ฒ„ํ‚ท์— ๊ฐ€์„œ ๊ฐ์ฒด๋ฅผ ์ฐพ์œผ๋ ค ํ•œ ๊ฒƒ์ด๋‹ค.

HashMap์€ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์—”ํŠธ๋ฆฌ๋ผ๋ฆฌ๋Š” ๋™์น˜์„ฑ ๋น„๊ต๋ฅผ ์‹œ๋„์กฐ์ฐจ ์•Š๋„๋ก ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” PhoneNumber์— ์ ์ ˆํ•œ hashCode ๋ฉ”์„œ๋“œ๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

๋™์น˜์ธ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๋˜‘๊ฐ™์€ hashCode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ(bad)

@Override 
public int hashCode() {
    return 42;
}

์•ˆ ๋œ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด์—๊ฒŒ ๋˜‘๊ฐ™์€ ๊ฐ’๋งŒ ๋‚ด์–ด์ฃผ๋ฏ€๋กœ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ๋ฒ„ํ‚ท ํ•˜๋‚˜์— ๋‹ด๊ฒจ ๋งˆ์น˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ํ‰๊ท  ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด O(1)์ธ ํ•ด์‹œํ…Œ์ด๋ธ”์ด O(n)์œผ๋กœ ๋А๋ ค์ ธ์„œ, ๋„์ €ํžˆ ์“ธ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

3. ์ข‹์€ ํ•ด์‹œ ํ•จ์ˆ˜๋ผ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค(good)

์ข‹์€ hashCode๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ด์ƒ์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ์ฃผ์–ด์ง„ (์„œ๋กœ ๋‹ค๋ฅธ) ์ธ์Šคํ„ด์Šค๋“ค์„ 32๋น„ํŠธ ์ •์ˆ˜ ๋ฒ”์œ„์— ๊ท ์ผํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•ด์•ผ ํ•œ๋‹ค.

  1. int ๋ณ€์ˆ˜์ธ result๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’ c๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    • ์ด ๋•Œ, c๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฒซ๋ฒˆ์งธ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ๋‹จ๊ณ„ 2.1 ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ์ด๋‹ค.
    • ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ ํ•„๋“œ๋Š” equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋ฅผ ๋งํ•œ๋‹ค.
  2. ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚˜๋จธ์ง€ ํ•ต์‹ฌ ํ•„๋“œ์ธ f ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    1. ํ•ด๋‹น ํ•„๋“œ์˜ ํ•ด์‹œ์ฝ”๋“œ c ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
      • i. ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ์ธ ๊ฒฝ์šฐ:

        • ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฐ•์‹ฑ ํด๋ž˜์Šค์˜ hashCode() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
        • ์˜ˆ: Short.hashCode(f), Integer.hashCode(f) ๋“ฑ.
      • ii. ์ฐธ์กฐ ํƒ€์ž… ํ•„๋“œ์ธ ๊ฒฝ์šฐ:

        • ํ•ด๋‹น ํด๋ž˜์Šค์˜ equals() ๋ฉ”์„œ๋“œ๊ฐ€ ์ด ํ•„๋“œ์˜ equals()๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋น„๊ตํ•œ๋‹ค๋ฉด, ์ด ํ•„๋“œ์˜ hashCode()๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
        • ๊ณ„์‚ฐ์ด ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์œผ๋ฉด, ๊ทธ ํ•„๋“œ์˜ ํ‘œ์ค€ํ˜•(canonical representation)1์„ ๋งŒ๋“ค์–ด ๊ทธ ํ‘œ์ค€ํ˜•์˜ hashCode()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

        ์˜ˆ์‹œ 1: ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ปฌ๋ ‰์…˜ ํ•„๋“œ

        • ํ•„๋“œ๊ฐ€ Set<String> ํƒ€์ž…์ด๊ณ , ์ด ์ง‘ํ•ฉ์˜ ์š”์†Œ๋“ค์€ ์ˆœ์„œ๊ฐ€ ์—†๋‹ค.
        • Set ์ž์ฒด์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์š”์†Œ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด, equals()์™€ ์ผ๊ด€์„ฑ์ด ์—†์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
        • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
          • ์ด Set์„ ํ‘œ์ค€ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•˜์—ฌ List<String>์œผ๋กœ ๋งŒ๋“ ๋‹ค.
          • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์š”์†Œ๋“ค์ด ์ •๋ ฌ๋˜๋ฏ€๋กœ, hashCode()๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
        @Override
        public int hashCode() {
            List<String> sortedList = new ArrayList<>(stringSet);
            Collections.sort(sortedList);
            return sortedList.hashCode();
        }
      • ์˜ˆ์‹œ 2: ๋ณต์žกํ•œ ๊ฐ์ฒด ํ•„๋“œ

        • ํ•„๋“œ๊ฐ€ ๋ณต์žกํ•œ ๊ฐ์ฒด์ธ๋ฐ, ๊ทธ ๊ฐ์ฒด์˜ hashCode() ๊ตฌํ˜„์ด ์—†๊ฑฐ๋‚˜ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ๊ฐ€์ •
        • ๋˜๋Š” ๊ทธ ๊ฐ์ฒด์˜ ์ƒํƒœ ์ค‘์—์„œ ์šฐ๋ฆฌ ํด๋ž˜์Šค์˜ equals()์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ํ•ด์‹œ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค.
        • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
          • ํ•ด๋‹น ํ•„๋“œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด(ํ‘œ์ค€ํ˜•)๋ฅผ ๋งŒ๋“ ๋‹ค.
          • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ค‘์š”ํ•œ ํ•„๋“œ๋“ค๋งŒ ๋ชจ์•„์„œ List๋‚˜ String ๋“ฑ์œผ๋กœ ํ‘œํ˜„
          • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ ๊ฐ์ฒด์˜ hashCode()๋ฅผ ํ˜ธ์ถœ
        @Override
        public int hashCode() {
            // ๋ณต์žกํ•œ ๊ฐ์ฒด complexField์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”์ถœ
            String canonicalForm = complexField.getImportantPart();
            return canonicalForm.hashCode();
        }
        • ํ•„๋“œ์˜ ๊ฐ’์ด null์ด๋ฉด 0์„ ์‚ฌ์šฉํ•œ๋‹ค.
      • iii. ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ:

        • ํ•ต์‹ฌ ์›์†Œ ๊ฐ๊ฐ์„ ๋ณ„๋„์˜ ํ•„๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค.
        • ์œ„์˜ ๊ทœ์น™์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ๊ฐ ํ•ต์‹ฌ ์›์†Œ์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ ๋‹ค์Œ, ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ result๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
        • ๋ฐฐ์—ด์— ํ•ต์‹ฌ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ์ƒ์ˆ˜ 0์„ ์‚ฌ์šฉํ•œ๋‹ค.
        • ๋ชจ๋“  ์›์†Œ๊ฐ€ ํ•ต์‹ฌ ์›์†Œ๋ผ๋ฉด Arrays.hashCode()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ๋‹จ๊ณ„ 2.1์—์„œ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ c๋กœ result๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.
      • result = 31 * result + c;
  3. result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ํ•„๋“œ๋ฅผ ๊ณฑํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ result ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ํ•„๋“œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด์‹œ์ฝ”๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์ฝ”๋“œ ์˜ˆ์ œ: PhoneNumber ํด๋ž˜์Šค์˜ hashCode()

@Override
public int hashCode() {
    int result = Short.hashCode(areaCode);
    result = 31 * result + Short.hashCode(prefix);
    result = 31 * result + Short.hashCode(lineNum);
    return result;
}
  • ์ด ๋ฉ”์„œ๋“œ๋Š” PhoneNumber ์ธ์Šคํ„ด์Šค์˜ ํ•ต์‹ฌ ํ•„๋“œ 3๊ฐœ(areaCode, prefix, lineNum)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๋™๋“ฑํ•œ PhoneNumber ์ธ์Šคํ„ด์Šค๋“ค์€ ๋™์ผํ•œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

Objects.hash() ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

  • Objects ํด๋ž˜์Šค์˜ hash() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ์ค„๋กœ hashCode()๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
@Override
public int hashCode() {
    return Objects.hash(lineNum, prefix, areaCode);
}
  • ๊ฐ„๊ฒฐํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ ๋ฉด์—์„œ ์กฐ๊ธˆ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐฐ์—ด ์ƒ์„ฑ๊ณผ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

4. ํ•ด์‹œ ์ฝ”๋“œ ์บ์‹ฑ(์ง€์—ฐ ์ดˆ๊ธฐํ™”)

  • ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ด๊ณ  ํ•ด์‹œ์ฝ”๋“œ ๊ณ„์‚ฐ ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ, ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋งค๋ฒˆ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์บ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด์‹œ์˜ ํ‚ค๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด๋ผ๋ฉด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•ด ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.
  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”(Lazy Initialization)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜์Œ hashCode()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
private int hashCode; // ์ž๋™์œผ๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

@Override
public int hashCode() {
    int result = hashCode;
    if (result == 0) {
        result = Short.hashCode(areaCode);
        result = 31 * result + Short.hashCode(prefix);
        result = 31 * result + Short.hashCode(lineNum);
        hashCode = result;
    }
    return result;
}
  • ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  hashCode ํ•„๋“œ์— ์ €์žฅํ•œ๋‹ค.
  • ์ดํ›„์—๋Š” ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๊ณ„์‚ฐ ๋น„์šฉ์„ ์ค„์ธ๋‹ค.
  • ์ฃผ์˜: ํ•„๋“œ hashCode์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•ด์‹œ์ฝ”๋“œ ๊ฐ’๊ณผ ๋‹ฌ๋ผ์•ผ ๋‹ค.

5. ์ฃผ์˜ํ•  ์ 

๐ŸŒฑํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•˜์ง€ ๋ง ๊ฒƒ

  • equals๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ํ•ด์‹œ์ฝ”๋“œ2๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. (ํŒŒ์ƒ ํ•„๋“œ๋Š” ์ œ์™ธํ•ด๋„ ๋จ)
    • ๋‘ ๋ฒˆ์งธ๋ฅผ ์–ด๊ธฐ๊ฒŒ ๋  ์ˆ˜ ์žˆ์Œ
  • ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ต์‹œ๊ณ  ํ•ด์‹œ์ฝ”๋“œ3๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์˜์—ญ์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด ๋ช‡ ๊ฐœ์˜ ํ•ด์‹œ์ฝ”๋“œ๋กœ ์ง‘์ค‘๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์ œ๋กœ ์ž๋ฐ” 2 ์ด์ „์˜ String ํด๋ž˜์Šค๋Š” ์ตœ๋Œ€ 16๊ฐœ์˜ ๋ฌธ์ž๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋‹ค.

31์„ ๊ณฑํ•˜๋Š” ์ด์œ ๋Š” ๋น„์Šทํ•œ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๋•Œ ํ•ด์‹œํšจ๊ณผ๋ฅผ ํฌ๊ฒŒ ๋†’์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋‹ค.
๋น„์Šทํ•œ ๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์„๋•Œ ๊ทธ๋ƒฅ ๋”ํ•˜๋ฉด ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜ฌ ํ™•๋ฅ ์ด ๋†’๋‹ค. ์†Œ์ˆ˜์ด๋ฉด์„œ ํ™€์ˆ˜๋กœ ํ•ด์‹œ์ฝ”๋“œ์˜ ๋ถ„ํฌ๋ฅผ ๋” ๊ท ์ผํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ž˜์„œ 31์„ ๊ณฑํ•ด ํฐ์ˆ˜๋กœ ๋งŒ๋“ค์–ด ํ•ด์‹œํšจ๊ณผ๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

(๋งŒ์•ฝ ์ง์ˆ˜๋ผ๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒ์‹œ ์ •๋ณด๋ฅผ ์žƒ๊ฒŒ ๋จ. 2๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๊ธฐ ๋•Œ๋ฌธ)

๐ŸŒฑ API ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด์‹œ์ฝ”๋“œ ์ƒ์„ฑ ๊ทœ์น™์„ ์ƒ์„ธํžˆ ๊ณตํ‘œํ•˜์ง€ ๋ง ๊ฒƒ

  • String๊ณผ Integer๋ฅผ ํฌํ•จํ•ด, ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋งŽ์€ ํด๋ž˜์Šค์—์„œ hashcode ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •ํ™•ํ•œ ๊ฐ’์„ ์•Œ๋ ค์ค€๋‹ค.
  • ๋‚˜์ค‘์— ๋ฌธ์ œ ์ƒ๊ฒผ์„ ๋•Œ ๊ณ ์น˜๊ธฐ ์œ„ํ•จ

6. ์ถ”๊ฐ€ ์งˆ๋ฌธ

๐Ÿค” ์™œ ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ์—์„œ 31์„ ๊ณฑํ•˜๊ณ , ์ง์ˆ˜๋‚˜ 2๋ฅผ ๊ณฑํ•˜์ง€ ์•Š๋‚˜์š”?

ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณต์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

java์ฝ”๋“œ ๋ณต์‚ฌresult = 31 * result + c;

31์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ :

  1. ํ™€์ˆ˜์ด์ž ์†Œ์ˆ˜(prime number)์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:
    • ์ •๋ณด ์†์‹ค ๋ฐฉ์ง€: ์ง์ˆ˜๋ฅผ ๊ณฑํ•˜๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์‹œ ์ตœ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ ์†์‹ค๋˜์–ด ์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ™€์ˆ˜๋ฅผ ๊ณฑํ•˜๋ฉด: ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋น„ํŠธ ํŒจํ„ด์ด ๋” ์ž˜ ์„ž์—ฌ ์ •๋ณด ์†์‹ค์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  2. ์†Œ์ˆ˜๋ฅผ ๊ณฑํ•˜๋ฉด ํ•ด์‹œ ๋ถ„ํฌ๊ฐ€ ์ข‹์•„์ง‘๋‹ˆ๋‹ค:
    • ์ถฉ๋Œ ๊ฐ์†Œ: ์†Œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด์‹œ ์ฝ”๋“œ ๊ฐ’์ด ๋” ๊ท ์ผํ•˜๊ฒŒ ๋ถ„ํฌ๋˜์–ด ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค.
  3. ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ:
    • ์ตœ์ ํ™” ๊ฐ€๋Šฅ: 31์€ 25โˆ’12^5 - 125โˆ’1์ด๋ฏ€๋กœ, ๊ณฑ์…ˆ์„ ๋น„ํŠธ ์‹œํ”„ํŠธ์™€ ๋บ„์…ˆ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • 31 * i๋Š” (i << 5) - i์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ์„ฑ๋Šฅ ํ–ฅ์ƒ: ์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋กœ ์ธํ•ด ๊ณ„์‚ฐ ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
  4. ์ „ํ†ต์ ์ธ ๊ด€๋ก€:
    • ์—ญ์‚ฌ์ ์ธ ์ด์œ : ์ž๋ฐ”์˜ String ํด๋ž˜์Šค ๋“ฑ์—์„œ ์ด๋ฏธ 31์„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ, ์‹ค๋ฌด์—์„œ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ง์ˆ˜๋‚˜ 2๋ฅผ ๊ณฑํ•˜์ง€ ์•Š๋Š” ์ด์œ :

  • ๋น„ํŠธ ํŒจํ„ด์˜ ๋‹จ์ˆœํ™”:
    • 2๋ฅผ ๊ณฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํŠธ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ๊ณผ ๋™์ผ: i << 1๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • ๋น„ํŠธ ํ˜ผํ•ฉ ๋ถ€์กฑ: ๋น„ํŠธ ์‹œํ”„ํŠธ๋งŒ์œผ๋กœ๋Š” ๋น„ํŠธ ํŒจํ„ด์ด ์ถฉ๋ถ„ํžˆ ์„ž์ด์ง€ ์•Š์•„ ํ•ด์‹œ ์ฝ”๋“œ์˜ ๋‹ค์–‘์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ์ •๋ณด ์†์‹ค ์œ„ํ—˜:
    • ์ง์ˆ˜ ๊ณฑ์…ˆ ์‹œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฌธ์ œ: ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ์‹œ ์ตœ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ ์‚ฌ๋ผ์ ธ ํ•ด์‹œ ์ฝ”๋“œ์˜ ๊ณ ์œ ์„ฑ์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

๋‘ ์ •์ˆ˜ a์™€ b๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค:

  • a = 4 (์ด์ง„์ˆ˜ 0100)
  • b = 8 (์ด์ง„์ˆ˜ 1000)

2๋ฅผ ๊ณฑํ•  ๋•Œ:

  • 2 * a = 8 (์ด์ง„์ˆ˜ 1000)
  • 2 * b = 16 (์ด์ง„์ˆ˜ 10000)

๋น„ํŠธ๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์ƒ์œ„ ๋น„ํŠธ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

31์„ ๊ณฑํ•  ๋•Œ:

  • 31 * a = 124
  • 31 * b = 248

๊ฒฐ๊ณผ ๊ฐ’์ด ๋” ๋„“๊ฒŒ ํผ์ง€๊ณ , ๋น„ํŠธ ํŒจํ„ด์ด ๋” ๋ณต์žกํ•ด์ ธ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.


2. ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์™œ ์•ˆ ๋˜๋‚˜์š”? ๐Ÿค”

ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•  ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ์ :

  • ํ•ด์‹œ ๋ถ„ํฌ์˜ ๋ถˆ๊ท ํ˜•: ์ค‘์š”ํ•œ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๊ฐ์ฒด๋“ค์ด ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด์‹œ ์ฝ”๋“œ์˜ ์ง‘์ค‘: ํŠน์ • ๊ฐ’์— ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๋ชฐ๋ฆฌ๊ฒŒ ๋˜์–ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋ฒ„ํ‚ท์ด ๋ถˆ๊ท ํ˜•ํ•ด์ง‘๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜: ์ถฉ๋Œ์ด ๋งŽ์•„์ง€๋ฉด ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์ด O(1)์—์„œ O(n)์œผ๋กœ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

Person ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค:

public class Person {
    private String firstName; // ์ด๋ฆ„
    private String lastName;  // ์„ฑ
    private int age;          // ๋‚˜์ด

    // equals()๋Š” ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‚ฌ์šฉ
}

ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ firstName๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉด:

@Override
public int hashCode() {
    return firstName.hashCode();
}

๊ฒฐ๊ณผ:

  • ํ•ด์‹œ ์ฝ”๋“œ ์ถฉ๋Œ ์ฆ๊ฐ€: ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์œผ๋ฏ€๋กœ, ๊ทธ๋“ค์˜ ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: "ํ™๊ธธ๋™"์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋งŽ์€ ๊ฐ์ฒด๋“ค์ด ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ๋ฒ„ํ‚ท์˜ ๋ถˆ๊ท ํ˜•: ํ•ด์‹œ ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์ด ํ•œ ๋ฒ„ํ‚ท์— ๋ชฐ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๋ฌธ์ œ: ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ•ด๋‹น ๋ฒ„ํ‚ท์ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

์‹œ๊ฐ์  ์„ค๋ช…:

1,000๋ช…์˜ Person ๊ฐ์ฒด ์ค‘ 100๋ช…์ด "ํ™๊ธธ๋™"์ด๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.

  • ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•œ ๊ฒฝ์šฐ:
    • 100๋ช…์˜ "ํ™๊ธธ๋™" ๊ฐ์ฒด๋“ค์ด ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ ๋™์ผํ•œ ๋ฒ„ํ‚ท์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ:
    • firstName, lastName, age๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๋‹ค์–‘ํ•ด์ ธ ๊ฐ์ฒด๋“ค์ด ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋ฉ๋‹ˆ๋‹ค.

3. ํŒŒ์ƒ ํ•„๋“œ๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ํ•ต์‹ฌ ํ•„๋“œ์™€์˜ ๊ตฌ๋ถ„ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€์š”? ๐Ÿค”

ํŒŒ์ƒ ํ•„๋“œ๋ž€?

  • ์ •์˜: ๋‹ค๋ฅธ ํ•„๋“œ์˜ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜๊ฑฐ๋‚˜ ์œ ๋„๋œ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ฐ์ฒด์˜ ํ•ต์‹ฌ ์ •๋ณด์™€๋Š” ๋…๋ฆฝ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ๊ฐ์ฒด์˜ ์ •์ฒด์„ฑ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ•„๋“œ๋ž€?

  • ์ •์˜: ๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, equals() ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ง•:
    • ๊ฐ์ฒด์˜ ๋ณธ์งˆ์ ์ธ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฐ์ฒด์˜ ์ •์ฒด์„ฑ์ด ๋ณ€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ๊ธฐ์ค€:

  1. equals() ์‚ฌ์šฉ ์—ฌ๋ถ€:
    • equals() ๋ฉ”์„œ๋“œ์—์„œ ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ๋Š” ํ•ต์‹ฌ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
    • ๋น„๊ต์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ’์˜ ๋…๋ฆฝ์„ฑ:
    • ๋‹ค๋ฅธ ํ•„๋“œ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” ํ•ต์‹ฌ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
    • ๋‹ค๋ฅธ ํ•„๋“œ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜๋Š” ํ•„๋“œ๋Š” ํŒŒ์ƒ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  3. ๊ฐ์ฒด์˜ ์ •์ฒด์„ฑ์— ๋Œ€ํ•œ ์˜ํ–ฅ:
    • ํ•„๋“œ์˜ ๊ฐ’์ด ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด ํ•ต์‹ฌ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŒŒ์ƒ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

Circle ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค:

public class Circle {
    private double radius;        // ๋ฐ˜์ง€๋ฆ„ (ํ•ต์‹ฌ ํ•„๋“œ)
    private Point center;         // ์ค‘์‹ฌ ์ขŒํ‘œ (ํ•ต์‹ฌ ํ•„๋“œ)
    private double area;          // ๋ฉด์  (ํŒŒ์ƒ ํ•„๋“œ)

    @Override
    public boolean equals(Object o) {
        // radius์™€ center๋ฅผ ๋น„๊ต
    }
}
  • ํ•ต์‹ฌ ํ•„๋“œ:
    • radius, center๋Š” equals()์—์„œ ๋น„๊ตํ•˜๋ฏ€๋กœ ํ•ต์‹ฌ ํ•„๋“œ์ž…๋‹ˆ๋‹ค.
  • ํŒŒ์ƒ ํ•„๋“œ:
    • area๋Š” radius๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ ํŒŒ์ƒ ํ•„๋“œ์ด๋ฉฐ, ํ•ด์‹œ ์ฝ”๋“œ ๊ณ„์‚ฐ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

hashCode() ๊ตฌํ˜„:

@Override
public int hashCode() {
    int result = Double.hashCode(radius);
    result = 31 * result + center.hashCode();
    // area๋Š” ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.
    return result;
}

4. ๋™๋“ฑํ•œ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์™œ ์•ˆ ๋˜๋‚˜์š”? ๐Ÿค”

๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ์ œ์ :

@Override
public int hashCode() {
    return 42;
}
  • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ(42)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ํ•˜๋‚˜์˜ ๋ฒ„ํ‚ท์— ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์—ฌ ์„ฑ๋Šฅ์ด O(n)์œผ๋กœ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

๋„ํ‘œ๋ฅผ ํ†ตํ•œ ์„ค๋ช…:

ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด 10๊ฐœ์˜ ๋ฒ„ํ‚ท(์ธ๋ฑ์Šค 0~9)์„ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค.

์ •์ƒ์ ์ธ ๊ฒฝ์šฐ(์ข‹์€ ํ•ด์‹œ ์ฝ”๋“œ):

  • ๊ฐ์ฒด๋“ค์ด ๋‹ค์–‘ํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
๋ฒ„ํ‚ท 0: [ ]
๋ฒ„ํ‚ท 1: [ ]
๋ฒ„ํ‚ท 2: [๊ฐ์ฒด D]
๋ฒ„ํ‚ท 3: [๊ฐ์ฒด C]
๋ฒ„ํ‚ท 4: [ ]
๋ฒ„ํ‚ท 5: [๊ฐ์ฒด A]
๋ฒ„ํ‚ท 6: [ ]
๋ฒ„ํ‚ท 7: [๊ฐ์ฒด B]
๋ฒ„ํ‚ท 8: [ ]
๋ฒ„ํ‚ท 9: [ ]
  • ๊ฐ์ฒด๋“ค์ด ๋ฒ„ํ‚ท์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒ€์ƒ‰ ๋ฐ ์‚ฝ์ž… ์ž‘์—…์ด ๋น ๋ฆ…๋‹ˆ๋‹ค(O(1)).

๋ฌธ์ œ์˜ ๊ฒฝ์šฐ(๋ชจ๋“  ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ ๋™์ผ):

  • ๋ชจ๋“  ๊ฐ์ฒด์˜ ํ•ด์‹œ ์ฝ”๋“œ๊ฐ€ 42์ž…๋‹ˆ๋‹ค.
  • ๋ฒ„ํ‚ท ์ธ๋ฑ์Šค๋Š” 42 % 10 = 2๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
๋ฒ„ํ‚ท 0: [ ]
๋ฒ„ํ‚ท 1: [ ]
๋ฒ„ํ‚ท 2: [๊ฐ์ฒด A, ๊ฐ์ฒด B, ๊ฐ์ฒด C, ๊ฐ์ฒด D, ๊ฐ์ฒด E, ๊ฐ์ฒด F, ๊ฐ์ฒด G, ๊ฐ์ฒด H, ๊ฐ์ฒด I, ๊ฐ์ฒด J]
๋ฒ„ํ‚ท 3: [ ]
๋ฒ„ํ‚ท 4: [ ]
๋ฒ„ํ‚ท 5: [ ]
๋ฒ„ํ‚ท 6: [ ]
๋ฒ„ํ‚ท 7: [ ]
๋ฒ„ํ‚ท 8: [ ]
๋ฒ„ํ‚ท 9: [ ]
  • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋ฒ„ํ‚ท 2์— ๋ชฐ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„ํ‚ท 2๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด O(n)์œผ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ ๋ฐ ์˜ํ–ฅ:

  • ์„ฑ๋Šฅ ์ €ํ•˜:
    • ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ด์ ์ด ์‚ฌ๋ผ์ง€๊ณ , ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ์ˆ˜์ค€์œผ๋กœ ๋А๋ ค์ง‘๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๋ถˆ๊ฐ€:
    • ์‹ค๋ฌด์—์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง€๋ฏ€๋กœ, ์ด๋Ÿฌํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์š”์ :

  • ๊ณ ์œ ํ•œ ํ•ด์‹œ ์ฝ”๋“œ ์ƒ์„ฑ: ๊ฐ์ฒด๋“ค์„ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์ž˜ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • equals()์™€์˜ ์ผ๊ด€์„ฑ ์œ ์ง€: ๋™๋“ฑํ•œ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜์ง€๋งŒ, ๋น„๋™๋“ฑํ•œ ๊ฐ์ฒด๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ์ˆ˜ ํ•ด์‹œ ์ฝ”๋“œ ์ง€์–‘: ํ•ด์‹œ ์ฝ”๋“œ์—์„œ ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์„ ํ†ตํ•ด ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ด์„ค๊ณผ ์˜ˆ์‹œ๋ฅผ ์ œ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ•ด์‹œ ์ฝ”๋“œ ๊ตฌํ˜„ ์‹œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœจ ๊ฒฐ๋ก 

equals๋ฅผ ์žฌ์ •์˜ํ•  ๋•Œ๋Š” hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
์žฌ์ •์˜ํ•œ hashCode๋Š” Object์˜ API ๋ฌธ์„œ์— ๊ธฐ์ˆ ๋œ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๋”ฐ๋ผ์•ผ ํ•˜๋ฉฐ, ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ๋˜๋„๋ก ํ•ด์‹œ์ฝ”๋“œ๋„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. AutoValue ํ”„๋ ˆ์ž„์›Œํฌ๋ฅด ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ‹์ง„ equals์™€ hashCode๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

Footnotes

  1. ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด โ†ฉ

  2. ํ•ด์‹œ์ฝ”๋“œ์˜ ์—ญํ• :

    • ๊ฐ์ฒด๋ฅผ ํ•ด์‹œ ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • equals() ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

    ํ•ด์‹œ์ฝ”๋“œ ๊ทœ์•ฝ:

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