[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashcode๋„ ์žฌ์ •์˜ํ•˜๋ผ. (hashCode ๊ตฌํ˜„ ๋ฐฉ๋ฒ•)

2023. 1. 30. 14:37ใ†JAVA/Effective JAVA

728x90

 

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

 

hashCode ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• 

@Override
public int hashCode()
{
   int result = Short.hashCode(areaCode);
   result = 31 * result + Short.hashCode(prefix);
   result = 31 * result + Short.hashCode(lineNum);
   return result;
}

1๏ธโƒฃ int ๋ณ€์ˆ˜ result๋ฅผ ์„ ์–ธํ•œ ํ›„ ๊ฐ’ c๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ด๋•Œ c๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฒซ๋ฒˆ์งธ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ๋‹จ๊ณ„ 2๏ธโƒฃ.a๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ์ด๋‹ค. 

(ํ•ต์‹ฌํ•„๋“œ๋Š” equals ๋น„๊ต์— ์‚ฌ์šฉ๋˜๋Š” ํ•„๋“œ) 

 

2๏ธโƒฃ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚˜๋จธ์ง€ ํ•ต์‹ฌ ํ•„๋“œ f ๊ฐ๊ฐ์— ๋Œ€ํ•ด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

     a. ํ•ด๋‹น ํ•„๋“œ์˜ ํ•ด์‹œ์ฝ”๋“œ c๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. 

          1. ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ๋ผ๋ฉด Type.hashCode(f)๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Type์€ ํ•ด๋‹น ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ•์‹ฑ ํด๋ž˜์Šค์ด๋‹ค. 
          2. ์ฐธ์กฐ ํƒ€์ž… ํ•„๋“œ๋ฉด์„œ ์ด ํด๋ž˜์Šค์˜ equals ๋ฉ”์„œ๋“œ๊ฐ€ ์ด ํ•„๋“œ์˜ equals๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•ด ๋น„๊ตํ•œ๋‹ค๋ฉด, ์ด ํ•„๋“œ์˜ hashCode๋ฅผ ์žฌ๊ท€                 ์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ํ•„๋“œ์˜ ๊ฐ’์ด null์ด๋ฉด 0์„ ์‚ฌ์šฉํ•œ๋‹ค. 

          3. ํ•„๋“œ๊ฐ€ ๋ฐฐ์—ด์ด๋ผ๋ฉด, ํ•ต์‹ฌ ์›์†Œ ๊ฐ๊ฐ์„ ๋ณ„๋„ ํ•„๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฃฌ๋‹ค. ์ด์ƒ์˜ ๊ทœ์น™์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•ด ํ•ต์‹ฌ ์›์†Œ์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ ๋‹ค                   ์Œ, ๋‹จ๊ณ„ 2๏ธโƒฃ.b ๋ฐฉ์‹์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ํ•ต์‹ฌ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์ƒ์ˆ˜ 0์„ ์ถ”์ฒœํ•œ๋‹ค. ๋ชจ๋“  ์›์†Œ๊ฐ€ ํ•ต์‹ฌ ์›์†Œ๋ผ๋ฉด                             Arrays.hashCode๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

      b. ๋‹จ๊ณ„ 2๏ธโƒฃ.a ์—์„œ ๊ณ„์‚ฐํ•œ ํ•ด์‹œ์ฝ”๋“œ c๋กœ result๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. 

 

3๏ธโƒฃ result๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  

 

 

๐Ÿ’ก ๊ณฑํ•œ ์ˆซ์ž๋ฅผ 31๋กœ ์ •ํ•œ ์ด์œ  

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

์†Œ์ˆ˜๋ฅผ ๊ณฑํ•˜๋Š” ์ด์œ ๋Š” ์ „ํ†ต์ ์œผ๋กœ ์†Œ์ˆ˜๋ฅผ ๊ณฑํ•ด์™”๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

๊ฒฐ๋ก ์€ 31์„ ๊ณฑํ•˜๋ฉด ์‹œํ”„ํŠธ ์—ฐ์‚ฐ๊ณผ ๋บ„์…ˆ์œผ๋กœ ๋Œ€์ฒดํ•ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. 

(๋‹ค๋ฅธ ์ˆซ์ž ๋ง‰ 37 ์ด๋Ÿฐ๊ฑฐ๋กœ ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.) 

 

 

๋ฐฉ๋ฒ•1) 

@Override
public int hashCode()
{
   int result = Short.hashCode(areaCode);
   result = 31 * result + Short.hashCode(prefix);
   result = 31 * result + Short.hashCode(lineNum);
   return result;
}

-> ์ „ํ˜•์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” hashCode() ์ด๋‹ค. 

 

 

๋ฐฉ๋ฒ•2)  

@Override
public int hashCode()
{
   return Objects.hash(areaCode, prefix, lineNum);
}

-> Objects ํด๋ž˜์Šค๋Š” ์ž„์˜์˜ ๊ฐœ์ˆ˜๋งŒํผ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•ด์ฃผ๋Š” ์ •์  ๋ฉ”์„œ๋“œ์ธ hash๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ•œ์ค„๋กœ hashCode ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

ํ•˜์ง€๋งŒ ์œ„์— ์ฝ”๋“œ์— ๋น„ํ•˜๋ฉด ์†๋„๊ฐ€ ๋” ๋Š๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค. (์ž…๋ ฅ ์ธ์ˆ˜๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด์ด ๋งŒ๋“ค์–ด์ง€๊ณ , ์ž…๋ ฅ ์ค‘ ๊ธฐ๋ณธ ํƒ€์ž…์ด ์žˆ๋‹ค๋ฉด ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ๋„ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

์ด ๋ฐฉ๋ฒ•์€ ์ธํ…”๋ฆฌ์ œ์ด์˜ ๋„์›€์„ ๋ฐ›์•„ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋“ฑ์žฅ?ํ•˜๋Š” ์ฝ”๋“œ์ด๊ธฐ๋„ ํ•˜๋‹ค. 

 

 

 

 

๋ฐฉ๋ฒ•3) 

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 ์ž‘์„ฑ ์ฃผ์˜์‚ฌํ•ญ 

- ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด? ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ƒ๋žตํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. 

: ์†๋„๋Š” ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•ด์‹œ ํ’ˆ์งˆ์ด ๋‚˜๋น ์ ธ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์„ฑ๋Šฅ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค. 

 

 

- hashCode๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์˜ ์ƒ์„ฑ ๊ทœ์น™์„ API ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž์„ธํžˆ ๊ณตํ‘œํ•˜์ง€ ๋งํ•˜์•ผ ํ•œ๋‹ค. 

 

 

 

 

๐Ÿ˜๐Ÿ“–

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

๋งŒ์•ฝ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. 

์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋ฉด ๋˜๋„๋ก ํ•ด์‹œ์ฝ”๋“œ๋„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  equals์™€ hashCode๋ฅผ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Lombok์ด ์žˆ๋‹ค. 

Lombok์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ฝ”๋“œ๋“ค์„ ์ž‘์„ฑํ•ด์ค€๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90