item 19 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

μ•„μ΄ν…œ 19 상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. κ·ΈλŸ¬μ§€ μ•Šμ•˜λ‹€λ©΄ 상속을 κΈˆμ§€ν•˜λΌ

  • μš°μ„ , λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚˜λŠ”μ§€λ₯Ό μ •ν™•νžˆ μ •λ¦¬ν•˜μ—¬ λ¬Έμ„œλ‘œ 남겨야 ν•œλ‹€. 달리 λ§ν•˜λ©΄, μƒμ†μš© ν΄λž˜μŠ€λŠ” μž¬μ •μ˜ν•  수 μžˆλŠ” λ©”μ„œλ“œλ“€μ„ λ‚΄λΆ€μ μœΌλ‘œ μ–΄λ–»κ²Œ μ΄μš©ν•˜λŠ”μ§€(μžκΈ°μ‚¬μš©) λ¬Έμ„œλ‘œ 남겨야 ν•œλ‹€.
  • 클래슀의 API 둜 곡개된 λ©”μ„œλ“œμ—μ„œ 클래슀 μžμ‹ μ˜ 또 λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  μˆ˜λ„ μžˆλ‹€. 그런데 마침 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œκ°€ μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλΌλ©΄ κ·Έ 사싀을 ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œμ˜ API μ„€λͺ…에 μ μ‹œν•΄μ•Ό ν•œλ‹€. λ§λΆ™μ—¬μ„œ μ–΄λ–€ μˆœμ„œλ‘œ ν˜ΈμΆœν•˜λŠ”μ§€, 각각의 호좜 κ²°κ³Όκ°€ μ΄μ–΄μ§€λŠ” μ²˜λ¦¬μ— μ–΄λ–€ 영ν–₯을 μ£ΌλŠ”μ§€λ„ λ‹΄μ•„μ•Ό ν•œλ‹€

λ¬Έμ„œλ‘œ λ‚¨κΈ°λŠ” 것이 μ΅œμ„ μΈκ°€?

  • ν•˜μ§€λ§Œ 이런 식은 β€œμ’‹μ€ API λ¬Έμ„œλž€ β€˜μ–΄λ–»κ²Œβ€™κ°€ μ•„λ‹Œ β€˜λ¬΄μ—‡β€™μ„ ν•˜λŠ”μ§€λ₯Ό μ„€λͺ…ν•΄μ•Ό ν•œλ‹€β€λΌλŠ” κ²©μ–Έκ³ΌλŠ” λŒ€μΉ˜λ˜μ§€ μ•Šλ‚˜? κ·Έλ ‡λ‹€. 상속이 μΊ‘μŠν™”λ₯Ό ν•΄μΉ˜κΈ° λ•Œλ¬Έμ— μΌμ–΄λ‚˜λŠ” μ•ˆνƒ€κΉŒμš΄ ν˜„μ‹€μ΄λ‹€. 클래슀λ₯Ό μ•ˆμ „ν•˜κ²Œ 상속할 수 μžˆλ„λ‘ ν•˜λ €λ©΄ (μƒμ†λ§Œ μ•„λ‹ˆμ—ˆλ‹€λ©΄ κΈ°μˆ ν•˜μ§€ μ•Šμ•˜μ–΄μ•Ό ν• ) λ‚΄λΆ€ κ΅¬ν˜„ 방식을 μ„€λͺ…ν•΄μ•Όλ§Œ ν•œλ‹€.

  • 이처럼 λ‚΄λΆ€ λ©”μ»€λ‹ˆμ¦˜μ„ λ¬Έμ„œλ‘œ λ‚¨κΈ°λŠ” κ²ƒλ§Œμ΄ 상속을 μœ„ν•œ μ„€κ³„μ˜ μ „λΆ€λŠ” μ•„λ‹ˆλ‹€. 효율적인 ν•˜μœ„ 클래슀λ₯Ό 큰 어렀움 없이 λ§Œλ“€ 수 있게 ν•˜λ €λ©΄ 클래슀의 λ‚΄λΆ€ λ™μž‘ κ³Όμ • 쀑간에 끼어듀 수 μžˆλŠ” ν›…(hook)을 잘 μ„ λ³„ν•˜μ—¬ protected λ©”μ„œλ“œ ν˜•νƒœλ‘œ κ³΅κ°œν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€.

상속을 ν—ˆμš©ν•˜λŠ” ν΄λž˜μŠ€κ°€ μ§€μΌœμ•Όν•  μ œμ•½

  • κ·Έλ ‡λ‹€λ©΄ μƒμ†μš© 클래슀λ₯Ό 섀계할 λ•Œ μ–΄λ–€ λ©”μ„œλ“œλ₯Ό protected둜 λ…ΈμΆœν•΄μ•Όν• μ§€λŠ” μ–΄λ–»κ²Œ κ²°μ •ν• κΉŒ? μ•ˆνƒ€κΉκ²Œλ„ λ§ˆλ²•μ€ μ—†λ‹€. μ‹¬μ‚¬μˆ™κ³ ν•΄μ„œ 잘 μ˜ˆμΈ‘ν•΄λ³Έ λ‹€μŒ, μ‹€μ œ ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€μ–΄ μ‹œν—˜ν•΄λ³΄λŠ” 것이 μ΅œμ„ μ΄λ‹€.
  • protected λ©”μ„œλ“œ ν•˜λ‚˜ν•˜λ‚˜κ°€ λ‚΄λΆ€ κ΅¬ν˜„μ— ν•΄λ‹Ήν•˜λ―€λ‘œ κ·Έ μˆ˜λŠ” κ°€λŠ₯ν•œ ν•œ 적어야 ν•œλ‹€. ν•œνŽΈμœΌλ‘œλŠ” λ„ˆλ¬΄ 적게 λ…ΈμΆœν•΄μ„œ μƒμ†μœΌλ‘œ μ–»λŠ” μ΄μ λ§ˆμ € 없애지 μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.
  • 널리 쓰일 클래슀λ₯Ό μƒμ†μš©μœΌλ‘œ μ„€κ³„ν•œλ‹€λ©΄ μ—¬λŸ¬λΆ„μ΄ λ¬Έμ„œν™”ν•œ λ‚΄λΆ€ μ‚¬μš© νŒ¨ν„΄κ³Ό, protected λ©”μ„œλ“œμ™€ ν•„λ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ μ„ νƒν•œ 결정에 μ˜μ›νžˆ μ±…μž„μ Έμ•Ό 함을 잘 인식해야 ν•œλ‹€.
  • μƒμ†μš© 클래슀의 μƒμ„±μžλŠ” μ§μ ‘μ μœΌλ‘œλ“  κ°„μ ‘μ μœΌλ‘œλ“  μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆ λœλ‹€. 이 κ·œμΉ™μ„ μ–΄κΈ°λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ˜€λ™μž‘ν•  것이닀.
  • cloneκ³Ό readObject λͺ¨λ‘ μ§μ ‘μ μœΌλ‘œλ“  κ°„μ ‘μ μœΌλ‘œλ“  μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆ λœλ‹€. 이 λ‘˜μ€ μƒμ„±μžμ™€ λΉ„μŠ·ν•œ 효과λ₯Ό λ‚Έλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ°€μž₯ 쒋은 방법은?

  • λ°”λ‘œ μƒμ†μš©μœΌλ‘œ μ„€κ³„ν•˜μ§€ μ•Šμ€ ν΄λž˜μŠ€λŠ” 상속을 κΈˆμ§€ν•˜λŠ” 것이닀.
  • 상속을 κΈˆμ§€ν•˜λŠ” 방법은 두 가지닀. λ‘˜ 쀑 더 μ‰¬μš΄ μͺ½μ€ 클래슀λ₯Ό final둜 μ„ μ–Έν•˜λŠ” 방법이닀. 두 번째 μ„ νƒμ§€λŠ” λͺ¨λ“  μƒμ„±μžλ₯Ό privateμ΄λ‚˜ package-private으둜 μ„ μ–Έν•˜κ³  public 정적 νŒ©ν„°λ¦¬λ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” 방법이닀.
  • ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ꡬ체 ν΄λž˜μŠ€κ°€ μ•„λ‹Œλ° 상속을 κΈˆμ§€ν•˜λ©΄ μ‚¬μš©ν•˜κΈ°μ— μƒλ‹Ήνžˆ λΆˆνŽΈν•΄μ§„λ‹€. 이런 ν΄λž˜μŠ€λΌλ„ 상속을 κΌ­ ν—ˆμš©ν•΄μ•Όκ² λ‹€λ©΄, 클래슀 λ‚΄λΆ€μ—μ„œ μž¬μ •μ˜ κ°€λŠ₯ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ²Œ λ§Œλ“€κ³  이 사싀을 λ¬Έμ„œλ‘œ λ‚¨κΈ°λŠ” 것이닀.

핡심정리

μƒμ†μš© 클래슀λ₯Ό μ„€κ³„ν•˜κΈ°λž€ κ²°μ½” 만만치 μ•Šλ‹€.
클래슀 λ‚΄λΆ€μ—μ„œ 슀슀둜λ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€(μžκΈ°μ‚¬μš© νŒ¨ν„΄) λͺ¨λ‘ λ¬Έμ„œλ‘œ 남겨야 ν•˜λ©°, 일단 λ¬Έμ„œν™”ν•œ 것은 κ·Έ ν΄λž˜μŠ€κ°€ μ“°μ΄λŠ” ν•œ λ°˜λ“œμ‹œ μ§€μΌœμ•Ό ν•œλ‹€.
κ·ΈλŸ¬μ§€ μ•ŠμœΌλ©΄ κ·Έ λ‚΄λΆ€ κ΅¬ν˜„ 방식을 λ―Ώκ³  ν™œμš©ν•˜λ˜ ν•˜μœ„ 클래슀λ₯Ό μ˜€λ™μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.
λ‹€λ₯Έ 이가 효율 쒋은 ν•˜μœ„ 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ„λ‘ 일뢀 λ©”μ„œλ“œλ₯Ό protected둜 μ œκ³΅ν•΄μ•Ό ν•  μˆ˜λ„ μžˆλ‹€.
κ·ΈλŸ¬λ‹ˆ 클래슀λ₯Ό ν™•μž₯ν•΄μ•Ό ν•  λͺ…ν™•ν•œ μ΄μœ κ°€ λ– μ˜€λ₯΄μ§€ μ•ŠμœΌλ©΄ 상속을 κΈˆμ§€ν•˜λŠ” 편이 λ‚˜μ„ 것이닀.
상속을 κΈˆμ§€ν•˜λ €λ©΄ 클래슀λ₯Ό final둜 μ„ μ–Έν•˜κ±°λ‚˜ μƒμ„±μž λͺ¨λ‘λ₯Ό μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 없도둝 λ§Œλ“€λ©΄ λœλ‹€.

⚠️ **GitHub.com Fallback** ⚠️