λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Java

[Java] μƒμ†μ΄λž€?

λ°˜μ‘ν˜•

상속

  • λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ λ†“λŠ” 것 μ΄μ™Έμ—λŠ” 상속을 μœ„ν•΄μ„œ μ•„λ¬΄λŸ° μž‘μ—…μ„ ν•  ν•„μš”λŠ” μ—†λ‹€.
  • μžμ‹ ν΄λž˜μŠ€λŠ” 클래슀 μ„ μ–Έμ‹œ extends λ‹€μŒμ— λΆ€λͺ¨ 클래슀 이름을 적어쀀닀.
  • μžμ‹ 클래슀의 μƒμ„±μžκ°€ 호좜되면, μžλ™μœΌλ‘œ λΆ€λͺ¨ 클래슀의 맀개 λ³€μˆ˜ μ—†λŠ” μƒμ„±μžκ°€ μ‹€ν–‰λœλ‹€.
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” public, protected둜 μ„ μ–Έλœ λͺ¨λ“  μΈμŠ€ν„΄μŠ€ 및 클래슀 λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

μƒμ†μ˜ ν•„μš”μ„±

μžλ°”μ—μ„œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ κ°–κ³  μžˆλŠ” λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό μƒμ†λ°›μŒμœΌλ‘œμ¨, κ°œλ°œν•  λ•Œ 이쀑, μ‚Όμ€‘μ˜ 일을 μ•ˆν•΄λ„ λœλ‹€.

예λ₯Όλ“€μ–΄, μ‚¬λžŒμ΄λΌλŠ” 클래슀λ₯Ό ν•™κ΅μ—μ„œ μ‚¬μš©ν•  λ•Œ, 기본적으둜 이름, μ „ν™”λ²ˆν˜ΈλŠ” κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜μ§€λ§Œ κ΅μˆ˜μ™€ 학생일 λ•Œ κ°€μ§ˆ 수 μžˆλŠ” 속성과 λ©”μ†Œλ“œκ°€ λ‹€λ₯Ό 수 μžˆλ‹€ 이럴 λ•Œ 곡톡적인 속성과 λ©”μ†Œλ“œλ₯Ό μ‚¬λžŒμ΄λΌλŠ” 클래슀λ₯Ό λ§Œλ“€κ³ , 학생과 κ΅μˆ˜λΌλŠ” 클래슀λ₯Ό μ‚¬λžŒ 클래슀λ₯Ό 상속받도둝 ν•˜λ©΄ λΆˆν•„μš”ν•œ μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€.

μžλ°”μ—μ„œλŠ” 닀쀑 상속이 μ•ˆ λœλ‹€. "extends 뒀에 클래슀λ₯Ό ν•˜λ‚˜λ§Œ 써야지, 두 개 이상 클래슀λ₯Ό λ‚˜μ—΄ν•˜λ©΄ 컴파일이 λ˜μ§€ μ•ŠλŠ”λ‹€."

상속과 μƒμ„±μž

  • λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œλŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ λ†“λŠ” 것 μ΄μ™Έμ—λŠ” 상속을 μœ„ν•΄μ„œ μ•„λ¬΄λŸ° μž‘μ—…μ„ ν•  ν•„μš”λŠ” μ—†λ‹€.

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“€μ§€ μ•ŠμœΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•˜λŠ”λ° 이 λ•Œ ν•΄κ²° 방법은 두가지가 μžˆλ‹€.

  1. λΆ€λͺ¨ ν΄λž˜μŠ€μ— "맀개 λ³€μˆ˜κ°€ μ—†λŠ”" κΈ°λ³Έ μƒμ„±μžλ₯Ό λ§Œλ“ λ‹€.
  2. μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λŠ” super()λ₯Ό μ‚¬μš©ν•œλ‹€.

μžλ°”μ—λŠ” superλΌλŠ” μ˜ˆμ•½μ–΄κ°€ μžˆλŠ”λ°, super()λ₯Ό μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” 것을 μ˜λ―Έν•˜κ³ , super.printName()을 μ‚¬μš©ν•˜λ©΄ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” printName()μ΄λΌλŠ” λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

μžλ°”λŠ” λΆ€λͺ¨μ˜ 맀개 λ³€μˆ˜κ°€ μ—†λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό μ°ΎλŠ” 것이 기본이닀. κ·Έλž˜μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ— 맀개 λ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ§Œ μžˆμ„ κ²½μš°μ—λŠ” super()λ₯Ό μ΄μš©ν•΄μ„œ λΆ€λͺ¨ μƒμ„±μžλ₯Ό κΌ­ ν˜ΈμΆœν•΄μ•Όλ§Œ ν•œλ‹€.

μ˜€λ²„λΌμ΄λ”©

μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ†Œλ“œμ™€ λ™μΌν•˜κ²Œ μ„ μ–Έν•˜λŠ” 것을 "λ©”μ†Œλ“œ Overriding"이라고 ν•œλ‹€. μ ‘κ·Ό μ œμ–΄μž, 리턴 νƒ€μž…, λ©”μ†Œλ“œ 이름, 맀개 λ³€μˆ˜ νƒ€μž… 및 κ°œμˆ˜κ°€ λͺ¨λ‘ λ™μΌν•΄μ•Όν•œλ‹€.

λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ„ μ–Έλ˜μ–΄ μžˆλŠ” λ©”μ†Œλ“œμ™€ λ™μΌν•˜κ²Œ μ„ μ–Έλ˜μ–΄ μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ— μ„ μ–Έν•˜λ©΄ μžμ‹ 클래슀의 λ©”μ†Œλ“œλ§Œ μ‹€ν–‰λœλ‹€.

ps. "λ™μΌν•˜κ²Œ μ„ μ–Έλ˜μ–΄ μžˆλ‹€"λŠ” "λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜(signature)λ₯Ό 가진닀" κ³  ν‘œν˜„ν•œλ‹€. μ‹œκ·Έλ‹ˆμ²˜λŠ” λ©”μ†Œλ“œ 이름과 맀개 λ³€μˆ˜μ˜ νƒ€μž… 및 개수λ₯Ό μ˜λ―Έν•œλ‹€.

μ˜€λ²„λΌμ΄λ”©μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ€ λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œμ™€ λ™μΌν•œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μžμ‹ 클래슀의 λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•  λ•Œ μ„±λ¦½λœλ‹€.
  • μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ λŒμΌν•œ 리턴 νƒ€μž…μ„ κ°€μ Έμ•Όλ§Œ ν•œλ‹€.
  • μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œμ˜ μ ‘κ·Ό μ œμ–΄μžλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ†Œλ“œμ™€ 달라도 λ˜μ§€λ§Œ, μ ‘κ·Ό κΆŒν•œμ΄ ν™•μž₯λ˜λŠ” κ²½μš°μ—λ§Œ ν˜€μš©λœλ‹€. μ ‘κ·Ό κΆŒν•œμ΄ μΆ•μ†Œλ  κ²½μš°μ—λŠ” 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

μ°Έμ‘° μžλ£Œν˜•μ˜ ν˜• λ³€ν™˜

μžμ‹ 클래슀 νƒ€μž…μ—μ„œ λΆ€λͺ¨ 클래슀 νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜μ„ ν•˜λ©΄ λ¬Έμ œκ°€ μ—†κ³ , λΆ€λͺ¨ 클래슀 νƒ€μž…μ—μ„œ μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ ν˜• λ³€ν™˜μ„ ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

  • μ°Έμ‘° μžλ£Œν˜•λ„ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€.
  • μžμ‹ νƒ€μž…μ˜ 객체λ₯Ό λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ ν˜• λ³€ν™˜ ν•˜λŠ” 것은 μžλ™μœΌλ‘œ λœλ‹€.
  • λΆ€λͺ¨ νƒ€μž…μ˜ 객체λ₯Ό μžμ‹ νƒ€μž…μœΌλ‘œ ν˜• λ³€ν™˜μ„ ν•  λ•Œμ—λŠ” λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ 지정해 μ£Όμ–΄μ•Ό ν•œλ‹€. μ΄λ•Œ, λΆ€λͺ¨ νƒ€μž…μ˜ μ‹€μ œ κ°μ²΄λŠ” μžμ‹ νƒ€μž…μ΄μ–΄μ•Όλ§Œ ν•œλ‹€.
  • instanceof μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 객체의 νƒ€μž…μ„ 확인할 수 μžˆλ‹€.
  • instanceof둜 νƒ€μž… 확인을 ν•  λ•Œ λΆ€λͺ¨ νƒ€μž…λ„ trueλΌλŠ” κ²°κ³Όλ₯Ό μ œκ³΅ν•œλ‹€.

λ‹€ν˜•μ„±(Polymorphism)

λ‹€ν˜•μ„±μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ„μ—μ„œ μ •λ¦¬ν•œ μ˜€λ²„λΌμ΄λ”©κ³Ό ν˜• λ³€ν™˜μ„ 이해해야 ν•œλ‹€.

예λ₯Όλ“€μ–΄μ„œ, ν•˜λ‚˜μ˜ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 두 개의 μžμ‹ 클래슀λ₯Ό λ§Œλ“€μ—ˆκ³  λͺ¨λ‘ μ˜€λ²„λΌμ΄λ”©λœ printName을 가지고 μžˆλ‹€κ³  ν–ˆμ„ λ•Œ.

Parent obj1 = new Parent();
Parent obj2 = new Child();
Parent obj3 = new OtherChild();

obj1.printName();
obj2.printName();
obj3.printName();
My Name is Parent
My Name is Child
My name is OtherChild

λͺ¨λ“  객체의 νƒ€μž…μ΄ Parent νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆμ§€λ§Œ, printName()의 κ²°κ³ΌλŠ” λͺ¨λ‘ λ‹€λ₯Έ 것을 λ³Ό 수 μžˆλ‹€.

μ™œλƒν•˜λ©΄ 각 객체의 μ‹€μ œ νƒ€μž…μ€ λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€. 이처럼 ν˜• λ³€ν™˜μ„ ν•˜λ”λΌλ„, μ‹€μ œ ν˜ΈμΆœλ˜λŠ” 것은 μ›λž˜ 객체에 μžˆλŠ” λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλœλ‹€. 이것이 λ°”λ‘œ λ‹€ν˜•μ„±μ΄λ‹€.

참고자료

μžλ°”μ˜ η₯ž1 2nd Edition / 이상민 μ§€μŒ

λ°˜μ‘ν˜•

'Java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] μžλ°” μ»¬λ ‰μ…˜ Set  (0) 2022.01.11
[Java] String 클래슀 정리  (0) 2022.01.08
[Java] λ³€μˆ˜μ™€ μžλ£Œν˜•  (0) 2022.01.04
[Java] μžλ°” ArrayList 정리  (0) 2021.09.16
[Java]μ •κ·œν‘œν˜„μ‹ 정리  (0) 2021.08.01