Item 10. equals

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

equalsλŠ” μž¬μ •μ˜ν•˜κΈ° μ‰¬μ›Œ λ³΄μ΄μ§€λ§Œ, 잘λͺ» μž¬μ •μ˜ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ˜€λ™μž‘ν•  수 μžˆλ‹€. λ•Œλ¬Έμ— ν•„μš”ν•œ κ²½μš°κ°€ μ•„λ‹ˆλ©΄ μž¬μ •μ˜ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹κ³ , λ‹€μŒμ˜ 상황이면 μž¬μ •μ˜ν•  ν•„μš”κ°€ μ—†λ‹€.

  • 각 μΈμŠ€ν„΄μŠ€κ°€ 본질적으둜 κ³ μœ ν•˜λ‹€.

  • μΈμŠ€ν„΄μŠ€μ˜ '논리적 λ™μΉ˜μ„±(logical equality)'을 검사할 일이 μ—†λ‹€.

  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•œ equalsκ°€ ν•˜μœ„ 클래슀의 equalsμ—μ„œλ„ μ•Œλ§žκ²Œ λ™μž‘ν•œλ‹€.

  • ν΄λž˜μŠ€κ°€ privateμ΄κ±°λ‚˜ package-private이고, equals λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  일이 μ—†λ‹€.

μœ„ 상황이 μ•„λ‹ˆλΌ 논리적 λ™μΉ˜μ„±μ„ 검사해야 ν•œλ‹€λ©΄, λ‹€μŒμ˜ κ·œμ•½μ„ 따라 μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€.

equals μž¬μ •μ˜ κ·œμ•½

  • λ°˜μ‚¬μ„±(reflexivity): null이 μ•„λ‹Œ λͺ¨λ“  μ°Έμ‘° κ°’ x에 λŒ€ν•΄, x.equals(x)λŠ” trueλ‹€.

  • λŒ€μΉ­μ„±(symmetry): null이 μ•„λ‹Œ λͺ¨λ“  μ°Έμ‘° κ°’ x, y에 λŒ€ν•΄, x.equals(y)κ°€ trueλ©΄ y.equals(x)도 trueλ‹€.

  • 좔이성(transitivity): null이 μ•„λ‹Œ λͺ¨λ“  μ°Έμ‘° κ°’ x, y, z에 λŒ€ν•΄, x.equals(y)κ°€ true이고 y.equals(z)도 trueλ©΄ x.equals(z)도 trueλ‹€.

  • 일관성(consistency): null이 μ•„λ‹Œ λͺ¨λ“  μ°Έμ‘° κ°’ x, y에 λŒ€ν•΄, x.equals(y)λ₯Ό λ°˜λ³΅ν•΄μ„œ ν˜ΈμΆœν•˜λ©΄ 항상 trueλ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ 항상 falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

  • null-μ•„λ‹˜: null이 μ•„λ‹Œ λͺ¨λ“  μ°Έμ‘° κ°’ x에 λŒ€ν•΄, x.equals(null)은 falseλ‹€.

얼핏보면 λ‹Ήμ—°ν•œ κ·œμ•½λ“€μ΄μ§€λ§Œ, μ‹€μˆ˜λ‘œ μ–΄κΈΈ 수 μžˆλŠ” κ·œμ•½λ“€μ΄λ‹€. μœ„μ˜ κ·œμ•½λ“€μ„ μ–΄κΈ΄ μ˜ˆμ‹œλ“€μ€ μ•„λž˜μ™€ κ°™λ‹€.

λ°˜μ‚¬μ„±

μ•…μ˜μ μΈ μ˜λ„κ°€ μ—†λ‹€λ©΄ μ–΄κΈΈ 일이 μ—†λ‹€.

λŒ€μΉ­μ„±

좔이성

μœ„μ˜ ColorPoint 클래슀 λ‚΄μ˜ equals κ΅¬ν˜„ λ‚΄μš©μ— 따라 κ·œμ•½ μœ„λ°° μ—¬λΆ€κ°€ κ²°μ •λœλ‹€. μš°μ„  μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•˜κ²Œ 되면 λŒ€μΉ­μ„±μ΄ μœ„λ°°λœλ‹€.

이λ₯Ό μˆ˜μ •ν•˜μ—¬ Point ν΄λž˜μŠ€μ— λŒ€ν•œ 비ꡐλ₯Ό μΆ”κ°€ν•˜λ©΄ λŒ€μΉ­μ„±μ€ μ§€μΌœμ§€μ§€λ§Œ, 좔이성이 μœ„λ°°λœλ‹€.

λ§Œμ•½ instanceof λŒ€μ‹  getClassλ₯Ό μ‚¬μš©ν•˜λ©΄ 좔이성은 μ§€μΌœμ§€μ§€λ§Œ, λŒ€μΉ­μ„±μ΄ μœ„λ°°λœλ‹€. λ˜ν•œ Point의 ν•˜μœ„ν΄λž˜μŠ€μΈ ColorPointκ°€ 더이상 Point둜써 μ‚¬μš©λ  수 μ—†κ²Œ λœλ‹€.(λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙 μœ„λ°°)

이와 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” κ²½μš°μ—λŠ” equals κ·œμ•½μ„ μ§€ν‚€λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€κ³  λ³Ό 수 μžˆμ§€λ§Œ, μš°νšŒν•˜λŠ” 방법이 μžˆλ‹€.

μœ„ λ°©λ²•μœΌλ‘œ equals κ·œμ•½μ„ 지킬 수 μžˆμ§€λ§Œ, ColorPointλ₯Ό Pointμ™€λŠ” 더이상 상속 κ΄€κ³„λŠ” μ•„λ‹ˆκ²Œ λœλ‹€.

일관성

equals의 νŒμ•ˆλ° μ‹ λ’°ν•  수 μ—†λŠ” μžμ›μ΄ 끼어듀지 μ•Šλ„λ‘ ν•΄μ•Ό ν•œλ‹€.

null-μ•„λ‹˜

instanceof μ—°μ‚°μžλ‘œ μž…λ ₯ λ§€κ°œλ³€μˆ˜κ°€ μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ ν™•μΈν•˜λ©΄ λͺ…μ‹œμ μœΌλ‘œ null 검사λ₯Ό ν•  ν•„μš”κ°€ μ—†λ‹€. μž…λ ₯이 null이면 νƒ€μž… 확인 λ‹¨κ³„μ—μ„œ falseλ₯Ό λ°˜ν™˜ν•˜λ―€λ‘œ null 검사λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

equals λ©”μ„œλ“œ κ΅¬ν˜„μ‹œ μ£Όμ˜μ‚¬ν•­

  1. == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄ μž…λ ₯이 자기 μžμ‹ μ˜ 참쑰인지 확인

    • 자기 μžμ‹ μ΄λ©΄ trueλ₯Ό λ°˜ν™˜

    • λ‹¨μˆœν•œ μ„±λŠ₯ μ΅œμ ν™”μš©μœΌλ‘œ 비ꡐ μž‘μ—…μ΄ λ³΅μž‘ν•œ 상황일 λ•Œ μ’‹μŒ

  2. instanceof μ—°μ‚°μžλ‘œ μž…λ ₯이 μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ 확인

    • 가끔 ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ κ΅¬ν˜„ν•œ νŠΉμ • μΈν„°νŽ˜μ΄μŠ€λ₯Ό 비ꡐ할 μˆ˜λ„ 있음

    • 이런 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀라면 equalsμ—μ„œ (ν΄λž˜μŠ€κ°€ μ•„λ‹Œ) ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•΄μ•Όν•¨

  3. μž…λ ₯을 μ˜¬λ°”λ₯Έ νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜

    • 2λ²ˆμ—μ„œ instanceof μ—°μ‚°μžλ‘œ μž…λ ₯이 μ˜¬λ°”λ₯Έ νƒ€μž…μΈμ§€ 검사 ν–ˆκΈ° λ•Œλ¬Έμ— 이 단계에선 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ

  4. μž…λ ₯ 객체와 자기 μžμ‹ μ˜ λŒ€μ‘λ˜λŠ” '핡심' ν•„λ“œλ“€μ΄ λͺ¨λ‘ μΌμΉ˜ν•˜λŠ”μ§€ ν•˜λ‚˜μ”© 검사

    • λͺ¨λ‘ μΌμΉ˜ν•΄μ•Ό trueλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ κ΅¬ν˜„

  5. κΈ°λ³Έ νƒ€μž…μ€ ==둜 λΉ„κ΅ν•˜κ³  μ°Έμ‘°νƒ€μž…μ€ equals둜 비ꡐ

  6. float, double ν•„λ“œλŠ” 정적 λ©”μ„œλ“œ Float.compare(float, float)와 Double.compare(double, double)둜 비ꡐ

    • Float.equals(float)λ‚˜ Double.equals(double)λŠ” μ˜€ν†  박싱을 μˆ˜λ°˜ν•΄ μ„±λŠ₯상 μ’‹μ§€ μ•ŠμŒ

  7. λ°°μ—΄ ν•„λ“œλŠ” μ›μ†Œ 각각을 μ§€μΉ¨λŒ€λ‘œ 비ꡐ

    • λͺ¨λ‘κ°€ 핡심 ν•„λ“œλΌλ©΄ Arrays.equals()λ₯Ό μ‚¬μš©

  8. NullPointException λ°œμƒμ„ μ˜ˆλ°©ν•˜κΈ° μœ„ν•΄ Object.equals(object, object)둜 비ꡐ

  9. ν•„λ“œμ˜ 비ꡐ μˆœμ„œλ₯Ό μž‘μ€ λΉ„μš©μ΄ λ“œλŠ” ν•„λ“œλΆ€ν„° 큰 λΉ„μš©μ΄ λ“œλŠ” ν•„λ“œ 순으둜 비ꡐ

  10. eqaulsλ₯Ό μž¬μ •μ˜ν•  땐 hashCode도 λ°˜λ“œμ‹œ μž¬μ •μ˜

Last updated

Was this helpful?