λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» 개발자 이야기/✏️ μ •λ¦¬λ…ΈνŠΈ

2λΆ€ μ½”λ“œμ„€κ³„ > 6μž₯ 클래슀 섀계 > μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ

by μ •μ„ ν•œ 2022. 9. 1.
728x90
λ°˜μ‘ν˜•

2λΆ€ μ½”λ“œ 섀계 > 6μž₯ ν΄λž˜μŠ€ μ„€κ³„ > μƒμ†λ³΄λ‹€λŠ” μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λΌ

였늘의 TIL 3쀄 μš”μ•½
  • λͺ…ν™•ν•œ is-a κ΄€κ³„μ—μ„œλŠ” 상속 (κ³„μΈ΅κ΅¬μ‘°μ˜ ν‘œν˜„, λ·°λ₯Ό 좜λ ₯)
  • μ»΄ν¬μ§€μ…˜μ„ ν†΅ν•œ μΈν„°νŽ˜μ΄μŠ€ 뢄리원칙, λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜μ›μΉ™ κ°œμ„ 
  • μœ„μž„νŒ¨ν„΄κ³Ό ν¬μ›Œλ”© λ©”μ„œλ“œ : μΊ‘μŠν™”κ°€ κΉ¨μ§€μ§€ μ•Šλ„λ‘ 관리

1. μ±…μ—μ„œ κΈ°μ–΅ν•˜κ³  싢은 λ‚΄μš©

상속에 λŒ€ν•œ λͺ‡ κ°€μ§€ 단점
- 상속은 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ§Œμ„ λŒ€μƒμœΌλ‘œ ν•  수 μžˆλ‹€. 상속을 μ‚¬μš©ν•˜λ‹€ 보면 λ§Žμ€ ν•¨μˆ˜λ₯Ό κ°–λŠ” κ±°λŒ€ν•œ 클래슀λ₯Ό κ°€μ§€κ²Œ 되고 μ΄λŠ” λ³΅μž‘ν•œ 계측ꡬ쑰λ₯Ό λ§Œλ“€μ–΄ λ‚Έλ‹€.
- 상속은 클래슀의 λͺ¨λ“  것을 κ°€μ Έμ˜¨λ‹€. λ”°λΌμ„œ λΆˆν•„μš”ν•œ ν•¨μˆ˜λ₯Ό κ°€μ§€λŠ” ν΄λž˜μŠ€κ°€ λ§Œλ“€μ–΄μ§ˆ 수 μžˆλ‹€. (μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙 μœ„λ°˜)
- 상속은 μ΄ν•΄ν•˜κΈ° μ–΄λ ΅κ³ , λ©”μ„œλ“œμ˜ μž‘λ™λ°©μ‹μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•˜μ—¬ 슈퍼클래슀λ₯Ό μ—¬λŸ¬ 번 확인해야 ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆλ‹€.
μ΄λŸ¬ν•œ μƒμ†μ˜ λ‹¨μ μœΌλ‘œ Composition:μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λŠ” 것을 μ œμ‹œν•œλ‹€.

단, μ»΄ν¬μ§€μ…˜μ€ μ‚¬μš© μ‹œ 객체λ₯Ό λ‹€λ₯Έ λͺ¨λ“  κ°μ²΄μ—μ„œ κ°€μ§€κ³  ν™œμš©ν•˜λŠ” μΆ”κ°€μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€.(이 뢀뢄은 μ˜ˆμ‹œλ‘œ μž‘μ„±λœ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜λŠ” 것이 ν•„μš”) 이 λ•Œλ¬Έμ— 상속을 μ„ ν˜Έν•˜λŠ” κ²½μš°λ„ λ§Žλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μΆ”κ°€ μ½”λ“œλ‘œ μΈν•˜μ—¬ μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒλ“€μ΄ μ½”λ“œμ˜ 싀행을 더 λͺ…ν™•ν•˜κ²Œ μ˜ˆμΈ‘ν•  수 있으며 ν•΄λ‹Ή 객체λ₯Ό 훨씬 μœ μ—°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

상속은 객체의 계측ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œ ꡉμž₯히 쒋은 λ„κ΅¬μ΄μ§€λ§Œ 슈퍼클래슀의 λ©”μ„œλ“œ, μ œμ•½, ν–‰μœ„ λ“±μ˜ λͺ¨λ“  것을 κ°€μ Έμ˜€κΈ° λ•Œλ¬Έμ— 일뢀뢄을 μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œλŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.
λ”°λΌμ„œ 상속받은 λŒ€μƒμ΄ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλ₯Ό κ°€μ§ˆ 수 있기 λ•Œλ¬Έμ— μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙에 μœ„λ°˜λ˜λ©° 슈퍼클래슀의 λ™μž‘μ„ μ„œλΈŒν΄λž˜μŠ€μ—μ„œ κΉ¨λ²„λ¦¬λ―€λ‘œ λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙에도 μœ„λ°˜λœλ‹€.
이런 상황일 λ•Œ, μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μœ„μ™€ 같은 μ„€κ³„λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ νƒ€μž…μ˜ 계측 ꡬ쑰λ₯Ό ν‘œν˜„ν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ 닀쀑 상속이 더 μœ λ¦¬ν•œ κ²½μš°κ°€ μžˆμœΌλ―€λ‘œ 상황에 λ”°λ₯Έ μ μ ˆν•œ 선택이 ν•„μš”ν•˜λ‹€.

상속은 내뢀적인 κ΅¬ν˜„ λ°©λ²•μ˜ 변경에 μ˜ν•˜μ—¬ 클래슀의 μΊ‘μŠν™”κ°€ κΉ¨μ–΄μ§ˆ 수 μžˆλ‹€. λΌμ΄λΈŒλŸ¬λ¦¬μ— 의쑴적인 μƒν™©μ˜ κ²½μš°μ— 라이브러리 λ³€κ²½ 사항에 λ”°λΌμ„œ μ˜λ„ν•œ λŒ€λ‘œ μ½”λ“œκ°€ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 있기 λ•Œλ¬Έμ— μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•΄ μ£ΌλŠ” 것이 ν•„μš”ν•˜λ‹€.
λ‹€λ§Œ μ»΄ν¬μ§€μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ‹€ν˜•μ„±μ΄ 사라지기 λ•Œλ¬Έμ— λ‹€ν˜•μ„±μ„ μœ μ§€ν•˜κΈ° μœ„ν•˜μ—¬ 상속을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” μœ„μž„(delegation)νŒ¨ν„΄μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

μœ„μž„(delegation) νŒ¨ν„΄μ€ ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›κ²Œ ν•˜κ³ , ν¬ν•¨ν•œ 객체의 λ©”μ„œλ“œλ₯Ό ν™œμš©ν•΄μ„œ, μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ •μ˜ν•œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ μ΄λ ‡κ²Œ κ΅¬ν˜„λœ λ©”μ„œλ“œλ₯Ό ν¬μ›Œλ”© λ©”μ„œλ“œ(forwarding method)라고 λΆ€λ₯Έλ‹€.
ν¬μ›Œλ”© λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•˜λ©΄ 컴파일 μ‹œμ μ— ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ΄ μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.

μ»΄ν¬μ§€μ…˜κ³Ό μƒμ†μ˜ 차이
- μ»΄ν¬μ§€μ…˜μ€ 더 μ•ˆμ „ν•˜λ‹€. μ™ΈλΆ€μ—μ„œ κ΄€μ°°λ˜λŠ” λ™μž‘μ—λ§Œ μ˜μ‘΄ν•œλ‹€.
- μ»΄ν¬μ§€μ…˜μ€ 더 μœ μ—°ν•˜λ‹€. μ»΄ν¬μ§€μ…˜μ€ μ—¬λŸ¬ 클래슀λ₯Ό λŒ€μƒμœΌλ‘œ ν•  수 있으며 ν•„μš”ν•œ κ²ƒλ§Œ λ°›μ•„μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.
- μ»΄ν¬μ§€μ…˜μ€ 더 λͺ…μ‹œμ μ΄λ‹€. μž₯점이자 단점. 
- μ»΄ν¬μ§€μ…˜μ€ 생각보닀 λ²ˆκ±°λ‘­λ‹€. λŒ€μƒ ν΄λž˜μŠ€μ— κΈ°λŠ₯ μΆ”κ°€ μ‹œ 이λ₯Ό ν¬ν•¨ν•˜λŠ” 객체의 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.
- 상속은 λ‹€ν˜•μ„±μ„ ν™œμš©ν•  수 μžˆλ‹€. μ–‘λ‚ μ˜ κ²€.

상속은 μ–Έμ œμ‚¬μš©ν•˜λŠ” 것이 쒋은가? 
- "is-a"관계가 λͺ…ν™•ν•  λ•Œ, 슈퍼클래슀λ₯Ό μƒμ†ν•˜λŠ” λͺ¨λ“  μ„œλΈŒν΄λž˜μŠ€λŠ” μŠˆνΌν΄λž˜μŠ€λ‘œλ„ λ™μž‘ν•  수 μžˆμ–΄μ•Ό ν•˜λ©° 슈퍼클래슀의 λͺ¨λ“  λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μ„œλΈŒν΄λž˜μŠ€λ‘œλ„ 톡과할 수 μžˆμ–΄μ•Ό ν•œλ‹€. (리슀 μ½”ν”„ μΉ˜ν™˜ 원칙)
- 객체 μ§€ν–₯ ν”„λ ˆμž„μ›Œν¬μ—μ„œ λ·°λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” Application(JavaFX), Activity(Android), UIViewController(iOS), React.Component(React) λ“±μ˜ λ·°λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ²ƒμ—λŠ” 상속을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€λŠ” 것을 κΈ°μ–΅ν•˜λΌ.

2. 였늘 읽은 μ†Œκ°, λ– μ˜€λ₯΄λŠ” 생각에 λŒ€ν•œ 정리

항상 λͺ¨λ“  κΈ°μˆ μ„œμ μ„ 읽을 λ•Œ, λ“œλŠ” 생각은 "λ‚˜λŠ” μ°Έ 잘λͺ»λœ λ°©μ‹μœΌλ‘œ μ‚΄μ•„μ™”κ΅¬λ‚˜." μž…λ‹ˆλ‹€. μ €λŠ” Kotlin을 ν†΅ν•œ 싀무 ν”„λ‘œμ νŠΈ κ²½ν—˜μ΄ μ•½ 2λ…„ 정도인데, κ·Έ μ‹œκ°„ λ™μ•ˆ 정말 κΈ°λŠ₯ μΆ”κ°€μ—λ§Œ κΈ‰κΈ‰ν–ˆκ΅¬λ‚˜ ν•˜λŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

μ»΄ν¬μ§€μ…˜, λ“€μ–΄λŠ” λ΄€κ³  일뢀 μ½”λ“œμ— 적용된 것도 λ³΄μ•˜μ§€λ§Œ μ œκ°€ 적극적으둜 μ½”λ“œμ— λ°˜μ˜ν–ˆλ˜ 적은 μ—†μ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. Java둜 κ΅¬ν˜„ν•˜λ©΄μ„œ 상속이 μ΅μˆ™ν–ˆλ˜ 건지...λŠ” 잘 λͺ¨λ₯΄κ² μ§€λ§Œ 맀번 μƒμ†μœΌλ‘œ κ΅¬ν˜„ν•˜κ³  μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λΆˆν•„μš”ν•œ μ½”λ“œμ—λŠ” 주석을 λ‹¬μ•„μ„œ 관리λ₯Ό ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. //TODO 이런 μ‹μœΌλ‘œμš”.🀯

이번 μž₯을 톡해 μ»΄ν¬μ§€μ…˜μ΄ μ™œ ν•„μš”ν–ˆλŠ”μ§€, μ™œ κ·Έ μ½”λ“œλ“€μ€ μ»΄ν¬μ§€μ…˜μœΌλ‘œ κ΅¬ν˜„ν–ˆλ˜ 건지 μ’€ 더 λͺ…ν™•ν•˜κ²Œ μ•Œ 수 μžˆμ—ˆκ³  μ•žμœΌλ‘œμ˜ μ½”λ“œμ—λŠ” κΌ­ μ μš©ν•΄μ„œ μ‚¬μš©ν•΄μ•Όκ² λ‹€λŠ” ν•„μš”μ„±μ„ λŠκΌˆμŠ΅λ‹ˆλ‹€. κΌ­κΌ­...κΌ­...μ»΄ν¬μ§€μ…˜..적용...!

 

728x90
λ°˜μ‘ν˜•