item 10 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e ์•„์ดํ…œ 10๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

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

  • ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ์œ ํ•˜๋‹ค. ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋™์ž‘ํ•˜๋Š” ๊ฐœ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ฌ๊ธฐ ํ•ด๋‹นํ•œ๋‹ค. Thread๊ฐ€ ์ข‹์€ ์˜ˆ๋กœ, Object์˜ equals ๋ฉ”์„œ๋“œ๋Š” ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค์— ๋”ฑ ๋งž๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šค์˜ '๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ'์„ ๊ฒ€์‚ฌํ•  ์ผ์ด ์—†๋‹ค.
  • ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•œ equals๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์—๋„ ๋”ฑ ๋“ค์–ด๋งž๋Š”๋‹ค. ์˜ˆ์ปจ๋Œ€ ๋Œ€๋ถ€๋ถ„์˜ Set ๊ตฌํ˜„์ฒด๋Š” AbstractSet์ด ๊ตฌํ˜„ํ•œ equals๋ฅผ ์ƒ์†๋ฐ›์•„ ์“ฐ๊ณ , List ๊ตฌํ˜„์ฒด๋“ค์€ AbstractList๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํด๋ž˜์Šค๊ฐ€ private์ด๊ฑฐ๋‚˜ package private์ด๊ณ  equals ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์—†๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•ด์•ผ ํ•  ๋•Œ๋Š” ์–ธ์ œ์ผ๊นŒ?

๊ฐ์ฒด ์‹๋ณ„์„ฑ(๋‘ ๊ฐ์ฒด๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€๊ฐ€)์ด ์•„๋‹ˆ๋ผ ๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ์„ ํ™•์ธํ•ด์•ผ ํ•  ๋•Œ๋‹ค. ๋‘ ๊ฐ’ ๊ฐ์ฒด๋ฅผ equals๋กœ ๋น„๊ตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด ํ•  ๊ฒƒ์ด๋‹ค.

๊ฐ’ ํด๋ž˜์Šค๋ผ ํ•ด๋„ ๊ฐ’์ด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‘˜ ์ด์ƒ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋Š” ์ธ์Šคํ„ด์Šค ํ†ต์ œ ํด๋ž˜์Šค๋ผ๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

equals ๋ฉ”์„œ๋“œ๋Š” ๋™์น˜๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋‹ค์Œ์„ ๋งŒ์กฑํ•œ๋‹ค.

  • ๋ฐ˜์‚ฌ์„ฑ : null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x์— ๋Œ€ํ•ด, x.equals(y)๋Š” true๋‹ค.
  • ๋Œ€์น˜์„ฑ : null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x, y์— ๋Œ€ํ•ด x.equals(y)๊ฐ€ true๋ฉด y.euqls(x)๋„ true๋‹ค.
  • ์ถ”์ด์„ฑ : null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x,y,z์— ๋Œ€ํ•ด x.equals(y)๊ฐ€ true์ด๊ณ  y.equals(z)๋„ true์ด๋ฉด x.equals(z)๋„ true์ด๋‹ค.
  • ์ผ๊ด€์„ฑ : null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x,y์— ๋Œ€ํ•ด x.equals(y)๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • null ์•„๋‹˜ : null์ด ์•„๋‹Œ ๋ชจ๋“  ์ฐธ์กฐ ๊ฐ’ x์— ๋Œ€ํ•ด x.equals(null)์€ false๋‹ค.

์ด ๊ทœ์•ฝ์„ ์–ด๊ธฐ๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ์ด์ƒํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๊ฒƒ์ด๊ณ , ์›์ธ์ด ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ๋„ ๊ต‰์žฅํžˆ ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.

์œ„์˜ ์กฐ๊ฑด์„ ํ† ๋Œ€๋กœ ์–‘์งˆ์˜ equals ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

  • == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  • instanceof ์—ฐ์‚ฐ์ž๋กœ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž… ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ์ด๋•Œ์˜ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์€ equals๊ฐ€ ์ •์˜๋œ ํด๋ž˜์Šค์ธ ๊ฒƒ์ด ๋ณดํ†ต์ด์ง€๋งŒ, ๊ฐ€๋”์€ ๊ทธ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•œ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์ž…๋ ฅ์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•œ๋‹ค. ์•ž์„œ 2๋ฒˆ์—์„œ instanceof๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋‹จ๊ณ„๋Š” 100% ์„ฑ๊ณตํ•œ๋‹ค.
  • ์ž…๋ ฅ ๊ฐ์ฒด์™€ ์ž๊ธฐ ์ž์‹ ์˜ ๋Œ€์‘๋˜๋Š” 'ํ•ต์‹ฌ' ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ์–ด๋–ค ํ•„๋“œ๋ฅผ ๋จผ์ € ๋น„๊ตํ•˜๋А๋ƒ๊ฐ€ equals์˜ ์„ฑ๋Šฅ์„ ์ขŒ์šฐํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ๋ฐ”๋ž€๋‹ค๋ฉด ๋‹ค๋ฅผ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ํฌ๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ๋น„์šฉ์ด ์‹ผ ํ•„๋“œ๋ฅผ ๋จผ์ € ๋น„๊ตํ•˜์ž
  • equals๋ฅผ ์žฌ์ •์˜ํ•  ๋• hashCode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•˜์ž(์•„์ดํ…œ11 ์ฐธ๊ณ )
  • Object ์™ธ์˜ ํƒ€์ž…์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” equals ๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธํ•˜์ง€ ๋ง์ž. ์ด ๋ฉ”์„œ๋“œ๋Š” Object.equals๋ฅผ ์žฌ์ •์˜ํ•œ ๊ฒŒ ์•„๋‹ˆ๋‹ค. ์ž…๋ ฅ ํƒ€์ž…์ด Object๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์žฌ์ •์˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์ค‘์ •์˜ ํ•œ๊ฒƒ์ด๋‹ค.

equals๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ์ผ์€ ์ง€๋ฃจํ•˜๊ณ  ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋„ ํ•ญ์ƒ ๋ป”ํ•˜๋‹ค. ๋‹คํ–‰ํžˆ ์ด ์ž‘์—…์„ ๋Œ€์‹ ํ•ด์ค„ ์˜คํ”ˆ์†Œ์Šค๊ฐ€ ์žˆ์œผ๋‹ˆ ๋ฐ”๋กœ ๊ตฌ๊ธ€์ด ๋งŒ๋“  AutoValue ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. ํด๋ž˜์Šค์— ์• ๋„ˆํ…Œ์ด์…˜ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด AutoValue๊ฐ€ ์ด ๋ฉ”์„œ๋“œ๋“ค์„ ์•Œ์•„์„œ ์ž‘์„ฑํ•ด์ฃผ๋ฉฐ, ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋˜‘๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ๊ฒƒ์ด๋‹ค.

๊ตฌ๊ธ€ AutoValue ์• ๋…ธํ…Œ์ด์…˜ ์˜ˆ์ œ ํ•„์š”

์ •๋ฆฌ

๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ๋ง์ž. ๋งŽ์€ ๊ฒฝ์šฐ์— Object์˜ equals๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์ด ์›ํ•˜๋Š” ๋น„๊ต๋ฅผ ์ •ํ™•ํžˆ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค. ์žฌ์ •์˜ํ•ด์•ผ ํ•  ๋•Œ๋Š” ๊ทธ ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ํ•„๋“œ๋ชจ๋‘๋ฅผ ๋น ์ง์—†์ด, ๋‹ค์„ฏ ๊ฐ€์ง€ ๊ทœ์•ฝ์„ ํ™•์‹คํžˆ ์ง€์ผœ๊ฐ€๋ฉฐ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค.