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

equalsλŠ” 일반 κ·œμ•½μ„ μ§€μΌœ μž¬μ •μ˜ν•˜λΌ.

μž¬μ •μ˜λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€.

equals λ©”μ„œλ“œλŠ” μž¬μ •μ˜ν•˜κΈ° μ‰¬μ›Œλ³΄μ΄μ§€λ§Œ 곳곳에 함정이 μžˆμ–΄ 큰 λ¬Έμ œκ°€ 될 수 μžˆλ‹€.
κ°€μž₯ μ‰¬μš΄ 길은 μ•„μ˜ˆ μž¬μ •μ˜λ₯Ό ν•˜μ§€ μ•ŠλŠ” 것이닀. μ•„λž˜ 상황에 ν•΄λ‹Ήν•œλ‹€λ©΄ μž¬μ •μ˜ ν•˜μ§€ μ•ŠλŠ”κ²ƒμ΄ μ΅œμ„ μ΄λ‹€.

  1. 각 μΈμŠ€ν„΄μŠ€κ°€ 본질적으둜 κ³ μœ ν•˜λ‹€. 값을 ν‘œν˜„ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ 개체λ₯Ό ν‘œν˜„ν•˜λŠ” ν΄λž˜μŠ€κ°€ ν•΄λ‹Ήλœλ‹€.
  2. μΈμŠ€ν„΄μŠ€μ˜ 논리적 λ™μΉ˜μ„±μ„ 검사할 일이 μ—†λ‹€.
  3. μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•œ equalsκ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—λ„ λ”± λ“€μ–΄λ§žλŠ”λ‹€.
  4. ν΄λž˜μŠ€κ°€ private μ—¬μ„œ equalsλ₯Ό ν˜ΈμΆœν•  일이 μ—†λ‹€.

μ‹€μˆ˜λ‘œλΌλ„ ν˜ΈμΆœλ˜λŠ” κ±Έ 막고싢닀면 μ˜ˆμ™Έμ²˜λ¦¬λ‘œ throw new AssertionError()λ₯Ό λ°œμƒμ‹œν‚€μž..


μž¬μ •μ˜ ν•˜λŠ” 상황

  • 논리적 λ™μΉ˜μ„±μ„ 비ꡐ해야할 λ•Œ μž¬μ •μ˜ν•˜λ©΄ μ’‹λ‹€. 객체가 μ•„λ‹ˆλΌ 값이 같은지λ₯Ό μ•Œκ³ μ‹Άμ„λ•Œ
  • Map의 ν‚€, Set의 μ›μ†Œ λ“±μœΌλ‘œ μ‚¬μš©ν•  λ•Œ

μž¬μ •μ˜ ν•  λ•ŒλŠ” λ‹€μŒ 일반 κ·œμ•½μ„ 따라야 ν•œλ‹€.

  1. λ°˜μ‚¬μ„± : 객체 X에 λŒ€ν•˜μ—¬ x.equals(x)λŠ” true μ—¬μ•Όν•œλ‹€.
  2. λŒ€μΉ­μ„± : 객체 X,y에 λŒ€ν•˜μ—¬ x.equals(y)κ°€ true이면 y.equals(x)도 true μ—¬μ•Όν•œλ‹€.
  3. 좔이성 : 객체 x,y,z에 λŒ€ν•˜μ—¬ x=y , y=z 이면 x=z도 true μ—¬μ•Όν•œλ‹€.
  4. 일관성 : null이 μ•„λ‹Œ μ°Έμ‘° κ°’x,y에 λŒ€ν•˜μ—¬ x.equals(y)λŠ” 항상 trueκ±°λ‚˜ falseμ—¬μ•Όν•œλ‹€.
  5. null-μ•„λ‹˜ : null이 μ•„λ‹Œ x에 λŒ€ν•˜μ—¬ x.equals(null) 은 false 이닀.

쒋은 equalsλ₯Ό κ΅¬ν˜„ν•˜λŠ” 법

  1. == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ 자기 μžμ‹ μ˜ 참쑰인지 ν™•μΈν•˜λΌ.
  2. instanceof μ—°μ‚°μžλ‘œ μž…λ ₯이 μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ ν™•μΈν•˜λΌ. null검사도 ν•΄μ€€λ‹€.
  3. μž…λ ₯을 μ˜¬λ°”λ₯Έ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λΌ.
  4. μž…λ ₯ 객체와 자기 μžμ‹ μ˜ λŒ€μ‘λ˜λŠ” 핡심 ν•„λ“œλ“€μ΄ λͺ¨λ‘ μΌμΉ˜ν•˜λŠ”μ§€ ν•˜λ‚˜μ”© κ²€μ‚¬ν•˜λΌ.
  5. μ„±λŠ₯을 μœ„ν•΄ λ‹€λ₯Ό κ°€λŠ₯성이 더 ν¬κ±°λ‚˜, λΉ„μš©μ΄ μ‹Ό ν•„λ“œλ₯Ό λ¨Όμ € 비ꡐ해라.

정리

equals λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ§€ 말자. κΌ­ ν•„μš”ν•˜λ‹€λ©΄ 5가지 κ·œμ•½μ„ λ°˜λ“œμ‹œ μ§€μΌœμ•Όν•œλ‹€.