[JAVA] 11. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°9. μΆ”μƒν΄λž˜μŠ€ μž‘μ„±, μΈν„°νŽ˜μ΄μŠ€

2022. 4. 24. 16:08ㆍJAVA/μžλ°”μ˜ 정석

728x90

https://hyejin.tistory.com/568

 

[JAVA] 11. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°8. λ‹€ν˜•μ„±, μΆ”μƒν΄λž˜μŠ€

https://hyejin.tistory.com/567 [JAVA] 11. 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°7. λ‹€ν˜•μ„± 1️⃣ λ‹€ν˜•μ„±(polymorphism) 객체지ν–₯κ°œλ…μ—μ„œ λ‹€ν˜•μ„±μ΄λž€ 'μ—¬λŸ¬κ°€μ§€ ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λŠ₯λ ₯'을 μ˜λ―Έν•˜λ©°, μžλ°”μ—μ„œλŠ” ν•œ νƒ€μž…μ˜ μ°Έ

hyejin.tistory.com

 

1️⃣ μΆ”μƒν΄λž˜μŠ€ μž‘μ„±

μ–΄λ–€ ν΄λž˜μŠ€μ— κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ  수 μžˆλŠ” 클래슀λ₯Ό λ°”λ‘œ μž‘μ„±ν•˜κΈ°λ„ ν•˜κ³ , 기쑴의 클래슀의 곡톡적인 뢀뢄을 λ½‘μ•„μ„œ μΆ”μƒν΄λž˜μŠ€λ‘œ λ§Œλ“€μ–΄ μƒμ†ν•˜λ„λ‘ ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€. 

 

상속이 μžμ† 클래슀λ₯Ό λ§Œλ“œλŠ”λ° 쑰상 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이라면, λ°˜λŒ€λ‘œ μΆ”μƒν™”λŠ” 기쑴의 클래슀의 곡톡적인 뢀뢄을 λ½‘μ•„λ‚΄μ„œ 쑰상 클래슀λ₯Ό λ§Œλ“œλŠ” 것이닀. 

 

상속 계측도에 따라 λ‚΄λ €κ°ˆμˆ˜λ‘ ν΄λž˜μŠ€λŠ” 점점 κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄ κ΅¬μ²΄ν™”μ˜ 정도가 심해지며, 상속 계측도λ₯Ό 따라 올라갈수둝 ν΄λž˜μŠ€λŠ” μΆ”μƒν™”μ˜ 정도가 심해진닀고 ν•  수 μžˆλ‹€. 

-> 즉, 상속 계측도λ₯Ό 따라 λ‚΄λ €κ°ˆμˆ˜λ‘ μ„ΈλΆ„ν™”λ˜κ³ , 올라갈수둝 곡톡 μš”μ†Œλ§Œ λ‚¨κ²Œ λœλ‹€.

 

좔상화: ν΄λž˜μŠ€κ°„μ˜ 곡톡점을 μ°Ύμ•„λ‚΄μ„œ κ³΅ν†΅μ˜ 쑰상을 λ§Œλ“œλŠ” μž‘μ—…
ꡬ체화: 상속을 톡해 클래슀λ₯Ό κ΅¬ν˜„, ν™•μž₯ν•˜λŠ” μž‘μ—… 

 

❓abstract λ₯Ό λΆ™μ—¬μ„œ μΆ”μƒλ©”μ„œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 이유 

μžμ† ν΄λž˜μŠ€μ—μ„œ 좔상 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μš”ν•˜κΈ° μœ„ν•΄μ„œμ΄λ‹€. 

만일 μΆ”μƒλ©”μ„œλ“œλ‘œ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šκ³  빈 λͺΈν†΅λ§Œ 가지도둝 μ •μ˜λ˜μ–΄ μžˆλ‹€λ©΄, μƒμ†λ°›λŠ” μžμ† ν΄λž˜μŠ€μ—μ„œλŠ” 이 λ©”μ„œλ“œλ“€μ΄ μ˜¨μ „νžˆ κ΅¬ν˜„λœ κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ³  μ˜€λ²„λΌμ΄λ”©μ„ 톡해 μžμ‹ μ˜ ν΄λž˜μŠ€μ— λ§žλ„λ‘ κ΅¬ν˜„ν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있기 λ•Œλ¬Έμ΄λ‹€. 

-> λ‹€ν˜•μ„±μ—μ„œ 배웠듯이 쑰상 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 것이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μ‘°μƒν¬λž˜μŠ€νƒ€μž…μ˜ 배열에 μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 담을 수 μžˆλ‹€. 

 

 

2️⃣ μΈν„°νŽ˜μ΄μŠ€ interface

μΈν„°νŽ˜μ΄μŠ€λŠ” μΌμ’…μ˜ μΆ”μƒν΄λž˜μŠ€μΈλ° ν•œλ§ˆλ””λ‘œ μΆ”μƒλ©”μ„œλ“œμ˜ 집합이닀. 

μΈν„°νŽ˜μ΄μŠ€λŠ” μΆ”μƒν΄λž˜μŠ€μ²˜λŸΌ μΆ”μƒλ©”μ„œλ“œλ₯Ό κ°–μ§€λ§Œ μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ 좔상화 정도가 λ†’μ•„μ„œ μΆ”μƒν΄λž˜μŠ€μ™€ 달리 λͺΈν†΅μ„ κ°–μΆ˜ 일반 λ©”μ„œλ“œ λ˜λŠ” λ©€λ²„λ³€μˆ˜λ₯Ό κ΅¬μ„±μ›μœΌλ‘œ κ°€μ§ˆ 수 μ—†λ‹€!!!

였직 μΆ”μƒλ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œμ„ λ©€λ²„λ‘œ κ°€μ§ˆ 수 있으며, κ·Έ μ™Έμ˜ λ‹€λ₯Έ μ–΄λ– ν•œ μš”μ†Œλ„ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€!!!

 

μΆ”μƒν΄λž˜μŠ€λ₯Ό λΆ€λΆ„μ μœΌλ‘œλ§Œ μ™„μ„±λœ 'λ―Έμ™„μ„± 섀계도' 라고 ν•œλ‹€λ©΄, μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„λœ 것은 아무것도 μ—†κ³  λ°‘κ·Έλ¦Όλ§Œ κ·Έλ €μ Έ μžˆλŠ” 'κΈ°λ³Έ 섀계도'라고 ν•  수 μžˆλ‹€. 

 

μΈν„°νŽ˜μ΄μŠ€ μž‘μ„±

μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν•˜λŠ” 것은 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것과 κ°™κ³ , ν‚€μ›Œλ“œλ₯Ό κ·Έλƒ₯ interfaceλ₯Ό μ“°λ©΄ λœλ‹€. 

interface μΈν„°νŽ˜μ΄μŠ€ 이름 {
   public static final νƒ€μž… μƒμˆ˜μ΄λ¦„ = κ°’;
   public abstract λ©”μ„œλ“œμ΄λ¦„(λ§€κ°œλ³€μˆ˜ λͺ©λ‘); 
}

-> λͺ¨λ“  λ©€λ²„λ³€μˆ˜λŠ” public static final이어야 ν•˜κ³ , 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

λͺ¨λ“  λ©”μ„œλ“œλŠ” pulbic abstract 이어야 ν•˜κ³ , 이λ₯Ό μƒλž΅ν•  수 μžˆλ‹€. 

❗️static λ©”μ„œλ“œμ™€ λ””ν΄νŠΈ λ©”μ„œλ“œλŠ” μ˜ˆμ™Έ!!

μ›λž˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” μΆ”μƒλ©”μ„œλ“œμ΄μ–΄μ•Ό ν•˜λŠ”λ°, jdk 1.8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€μ— static λ©”μ„œλ“œμ™€ λ””ν΄νŠΈ λ©”μ„œλ“œμ˜ μΆ”κ°€λ₯Ό ν—ˆμš©ν•˜λŠ” λ°©ν–₯으둜 λ³€κ²½λ˜μ—ˆλ‹€. 

 

 

μΈν„°νŽ˜μ΄μŠ€ 상속  

μΈν„°νŽ˜μ΄μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„°λ§Œ 상속받을 수 있으며 ,ν΄λž˜μŠ€μ™€λŠ” 달리 닀쀑상속 즉 μ—¬λŸ¬κ°œμ˜ μΈν„°νŽ˜μ΄μŠ€λ‘œλΆ€ν„° μƒμ†λ°›λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

 

 

μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„

μΈν„°νŽ˜μ΄μŠ€λ„ μΆ”μƒν΄λž˜μŠ€μ²˜λŸΌ κ·Έ μžμ²΄λ‘œλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μœΌλ©°, 좔상 ν΄λž˜μŠ€κ°€ 상속을 톡해 μΆ”μƒλ©”μ„œλ“œλ₯Ό μ™„μ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ μΈν„°νŽ˜μ΄μŠ€λ„ μžμ‹ μ— μ •μ˜λœ μΆ”μƒλ©”μ„œλ“œμ˜ λͺΈν†΅μ„ λ§Œλ“€μ–΄μ£ΌλŠ” 클래슀λ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. 

μΈν„°νŽ˜μ΄μŠ€λŠ” κ΅¬ν˜„ν•œλ‹€λŠ” 의미의 ν‚€μ›Œλ“œ implements λ₯Ό μ‚¬μš©ν•œλ‹€. 

 

class ν΄λž˜μŠ€μ΄λ¦„ implements μΈν„°νŽ˜μ΄μŠ€μ΄λ¦„ {

   // μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λœ 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

 

만일 κ΅¬ν˜„ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œ 쀑 μΌλΆ€λ§Œ κ΅¬ν˜„ν–ˆλ‹€λ©΄ abstract λ₯Ό λΆ™μ—¬μ„œ μΆ”μƒν΄λž˜μŠ€λ‘œ μ„ μ–Έν•΄μ•Ό ν•œλ‹€!!

그리고 상속과 κ΅¬ν˜„μ„ λ™μ‹œμ— ν•  μˆ˜λ„ μžˆλ‹€. 

-> Fighter ν΄λž˜μŠ€λŠ” Unit ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받고, Fightable μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ κ΅¬ν˜„ν–ˆμ§€λ§Œ, 

Unit ν΄λž˜μŠ€λŠ” Object 클래슀의 μžμ†μ΄κ³ , Fightable μΈν„°νŽ˜μ΄μŠ€λŠ” Attackable, Movable μΈν„°νŽ˜μ΄μŠ€μ˜ μžμ†μ΄λ―€λ‘œ Fighter ν΄λž˜μŠ€λŠ” λͺ¨λ“  ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μžμ†μ΄ λ˜λŠ” μ…ˆμ΄λ‹€. 

 

 

3️⃣ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ 닀쀑 상속 

두 μ‘°μƒμœΌλ‘œλΆ€ν„° μƒμ†λ°›λŠ” 멀버 μ€‘μ—μ„œ λ©€λ²„λ³€μˆ˜μ˜ 이름이 κ°™κ±°λ‚˜ λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€κ°€ μΌμΉ˜ν•˜κ³  κ΅¬ν˜„ λ‚΄μš©μ΄ λ‹€λ₯΄λ‹€λ©΄ 이 두 μ‘°μƒμœΌλ‘œλΆ€ν„° μƒμ†λ°›λŠ” μžμ†ν΄λž˜μŠ€λŠ” μ–΄λŠ μ‘°μƒμ˜ 것을 μƒμ†λ°›κ²Œ λ˜λŠ” 것인지 μ•Œ 수 μ—†λ‹€. 

μ–΄λŠ ν•œμͺ½μœΌλ‘œλΆ€ν„°μ˜ 상속을 ν¬κΈ°ν•˜κ±°λ‚˜, 이름이 μΆ©λŒν•˜μ§€ μ•Šλ„λ‘ 쑰상 클래슀λ₯Ό λ³€κ²½ν•˜λŠ” μˆ˜λ°–μ— μ—†λ‹€. 

 

μΈν„°νŽ˜μ΄μŠ€λŠ” static μƒμˆ˜λ§Œ μ •μ˜ν•  수 μžˆμœΌλ―€λ‘œ μ‘°μƒν΄λž˜μŠ€μ˜ λ©€λ²„λ³€μˆ˜μ™€ μΆ©λŒν•˜λŠ” κ²½μš°λŠ” 거의 μ—†κ³ , μΆ©λŒλœλ‹€ ν•˜λ”λΌλ„ 클래슀 이름을 λΆ™μ—¬μ„œ ꡬ뢄이 κ°€λŠ₯ν•˜λ‹€. 

그리고 μΆ”μƒλ©”μ„œλ“œλŠ” κ΅¬ν˜„ λ‚΄μš©μ΄ μ „ν˜€ μ—†μœΌλ―€λ‘œ μ‘°μƒν΄λž˜μŠ€μ˜ λ©”μ„œλ“œμ™€ μ„ μ–ΈλΆ€κ°€ μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λŠ” λ‹Ήμ—°νžˆ 쑰상 클래슀 μͺ½μ˜ λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μœΌλ©΄ λ˜λ―€λ‘œ λ¬Έμ œλ˜μ§€ μ•ŠλŠ”λ‹€. 

 

 

4️⃣ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„± 

λ‹€ν˜•μ„±μ— λŒ€ν•΄ ν•™μŠ΅ν•  λ•Œ μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ‘°μƒνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μ°Έμ‘°ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€λŠ” 것을 λ°°μ› λ‹€. 

ex) Tv t = new SmartTv();

 

μΈν„°νŽ˜μ΄μŠ€ μ—­μ‹œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 쑰상이라 ν•  수 μžˆμœΌλ―€λ‘œ, ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ 이λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 있으며, μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜λ„ κ°€λŠ₯ν•˜λ‹€. 

 

μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜κ°€ κ°–λŠ” μ˜λ―ΈλŠ” λ©”μ„œλ“œ 호좜 μ‹œ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ μ œκ³΅ν•΄μ•Όν•œλ‹€λŠ” 것이닀! 

그리고 λ‹€μŒκ³Ό 같이 λ©”μ„œλ“œμ˜ λ¦¬ν„΄νƒ€μž…μœΌλ‘œ μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 것 μ—­μ‹œ κ°€λŠ₯ν•˜λ‹€. 

λ¦¬ν„΄νƒ€μž…μ΄ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 것은 λ©”μ„œλ“œκ°€ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 

 

 

 

 

 

 

 

728x90