[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] Item11 ์™„๋ฒฝ๊ณต๋žต. ์Šค๋ ˆ๋“œ ์•ˆ์ „

2023. 1. 31. 10:23ใ†JAVA/Effective JAVA

728x90

 

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

" p71. ํด๋ž˜์Šค๋ฅผ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค."

 

 

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

 

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

item11. equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hashcode๋„ ์žฌ์ •์˜ํ•˜๋ผ. hashCode ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• @Override public int hashCode() { int result = Short.hashCode(areaCode); result = 31 * result + Short.hashCode(prefix); result = 31 * result + Short.hashCode(

hyejin.tistory.com

hashCode ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 3๋ฒˆ์งธ๋กœ ์†Œ๊ฐœํ•œ ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ด๊ณ  ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋น„์šฉ์ด ํฌ๋‹ค๋ฉด, ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์บ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ–ˆ๋Š”๋ฐ ์ด๋•Œ ํ•„๋“œ๋ฅผ ์ง€์—ฐ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๋„๋ก ์‹ ๊ฒฝ ์จ์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. 

 

 

์Šค๋ ˆ๋“œ ์•ˆ์ „ Thread-Safety ๋ž€? 

: ๋ฉ€ํ‹ฐ  ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜, ํ˜น์€ ๊ฐ์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ๋™์‹œ์— ์ ‘๊ทผ์ด ์ด๋ฃจ์–ด์ ธ๋„ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

์ฆ‰, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ํ•œ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ถœ๋˜์–ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์‹œ์— ํ•จ๊ป˜ ์‹คํ–‰๋˜๋”๋ผ๋„ ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ์˜ ํ•จ์ˆ˜์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 

 

 

 @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;
 }

์ด ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋‹ค. 

์ด๋ฅผ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•ใ…‡๋Š ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๋˜์ง€๋งŒ.. ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด Synchronization์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

 

private volatile int hashCode; 

// ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•
@Override
public int hashCode()
{
   if (this.hashCode != 0) {
      return hashCode;
   }
   
   synchronized (this) {
      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;
   }
}

์Šค๋ ˆ๋“œ1์ด ์ง€๊ธˆ  synchronized์—์„œ hashcode๋ฅผ ์ƒ์„ฑ์ค‘์ด๋ผ๋ฉด ์Šค๋ ˆ๋“œ2๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ  ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. 

 

synchronized๋ž€ ?

: ์ž๋ฐ”์—์„œ ๋ฐ์ดํ„ฐ์˜ Thread-safe๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•ด ์Šค๋ ˆ๋“œ ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์‹œ์ผœ ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. 

์ด ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ ๊ฐœ์˜ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด๋•Œ ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์Šค๋ ˆ๋“œ๋“ค์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜์—†๋„๋ก ๋ง‰๋Š” ๊ฐœ๋…์„ ๋งํ•œ๋‹ค. 

synchronized๋กœ ์„ค์ •๋œ ์ž„๊ณ„์˜์—ญ์€ lock ๊ถŒํ•œ์„ ์–ป์€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์ด ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

(์ด ํ‚ค์›Œ๋“œ๋ฅผ ๋„ˆ๋ฌด ๋‚จ๋ฐœํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.) 

 

 

๐Ÿ“š ๊ทธ๋ฆฌ๊ณ  Volatile ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ read ํ•  ๋•Œ main memory์—์„œ ์ฝ์–ด์™€์„œ ๋งˆ์ง€๋ง‰ ์Šค๋ ˆ๋“œ๊ฐ€ ์ €์žฅํ•œ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ผ๋„ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฐ’์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

 

Syncrhonization์€ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ๊ทธ ์™ธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 

- ThreadLocal 

- ๋ถˆ๋ณ€ ๊ฐ์ฒด ์‚ฌ์šฉ 

- Synchronized ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ (ex. HashTable)

- Concurrent ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ 

... ๋“ฑ์ด ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90