Search
Duplicate
πŸ˜€

07. 상속

νƒœκ·Έ
상속
super
동적 바인딩
좔상 클래슀

Java의 상속

상속
β€’
κΈ°μ‘΄ 클래슀의 μžμ‚°(멀버)을 μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•˜κΈ° μœ„ν•œ 것
β€’
λΆ€λͺ¨μ˜ μƒμ„±μžμ™€ μ΄ˆκΈ°ν™” 블둝(Initializer)λŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€
β€’
κΈ°μ‘΄ 클래슀의 멀버λ₯Ό λ¬Όλ €λ°›κΈ° λ•Œλ¬Έμ— μ½”λ“œμ˜ 절감 νš¨κ³Όκ°€ μžˆλ‹€
β€’
λΆ€λͺ¨μ˜ μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ©΄ λͺ¨λ“  μžμ‹λ“€μ—κ²Œ μ μš©λœλ‹€ β‡’ μœ μ§€λ³΄μˆ˜μ„± ν–₯상
β€’
μƒμ†μ˜ κ΄€κ³„λŠ” is a κ΄€κ³„λ‘œ 이루어진닀. (ex. μ‚¬λžŒ is a 포유λ₯˜)
단일 상속
β€’
ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀만 상속할 수 있음
β€’
λ‹€μ€‘μƒμ†μ˜ 경우 μ€‘λ³΅λ˜λŠ” λ³€μˆ˜μ™€ λ©”μ„œλ“œκ°€ μƒμ†λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμ–΄ μžλ°”μ—μ„œλŠ” λ¬Έλ²•μ μœΌλ‘œ λ‹¨μΌμƒμ†λ§Œμ„ ν—ˆμš©ν•œλ‹€.
포함 관계
β€’
상속 이외에 클래슀λ₯Ό μž¬ν™œμš©ν•˜λŠ” 방법
β€’
2개 이상 ν΄λž˜μŠ€μ—μ„œ νŠΉμ„±μ„ κ°€μ Έμ˜€λŠ” 경우 ν•˜λ‚˜λŠ” 상속, λ‚˜λ¨Έμ§€λŠ” 멀버 λ³€μˆ˜λ‘œ 처리

super ν‚€μ›Œλ“œ

super ν‚€μ›Œλ“œ
β€’
thisλ₯Ό 톡해 μžμ‹  객체에 μ ‘κ·Όν–ˆλ“―μ΄, superλ₯Ό 톡해 쑰상 클래슀 멀버에 μ ‘κ·Όν•œλ‹€.
λ³€μˆ˜μ˜ μŠ€μ½”ν”„
β€’
μ‚¬μš©λœ μœ„μΉ˜μ—μ„œ 점점 ν™•μž₯ν•΄κ°€λ©° 처음 λ§Œλ‚œ 선언뢀에 μ—°κ²°λœλ‹€.
β€’
method λ‚΄λΆ€ β‡’ ν•΄λ‹Ή 클래슀의 λ©€λ²„λ³€μˆ˜ β‡’ 쑰상 클래슀 λ©€λ²„λ³€μˆ˜
super()
β€’
쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€
β€’
μžμ‹ 클래슀 μƒμ„±μžμ˜ μ²«μ€„μ—μ„œλ§Œ 호좜 κ°€λŠ₯ν•˜λ‹€
β€’
λͺ…μ‹œμ μœΌλ‘œ this() λ˜λŠ” super()λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ€ 경우 μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ super()λ₯Ό μ‚½μž…ν•œλ‹€ β‡’ 결둠적으둜 ObjectκΉŒμ§€ 객체 μ „λΆ€ 생성!

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

β€’
λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ‚¬μš©ν•˜μ§€ μ•Šκ³  μƒˆλ‘­κ²Œ μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것
β€’
μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ λ©”μ„œλ“œλŠ” λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œμ™€ λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜μ˜ μœ ν˜• 및 κ°œμˆ˜κ°€ 동일해야 ν•œλ‹€.
β€’
μ˜€λ²„λΌμ΄λ”©κ³Ό μ˜€λ²„λ‘œλ”©μ„ 잘 κ΅¬λΆ„μ§€μ–΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. (μ•„λž˜μ˜ μ˜ˆμ‹œλŠ” Overriding이 μ•„λ‹Œ Overloading!)

superλ₯Ό ν†΅ν•œ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©

β€’
Overriding은 λΆ€λͺ¨μ˜ λ©”μ„œλ“œλ₯Ό μžμ‹μ΄ μƒˆλ‘­κ²Œ μ •μ˜ν•˜κ² λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ λΆ€λͺ¨κ°€ 가진 λ©”μ„œλ“œλŠ” μƒμ†λ˜μ§€ μ•ŠλŠ”λ‹€.
β€’
λ©”μ„œλ“œλ₯Ό Overridingν•˜λ©΄μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  싢은 κ²½μš°μ— superλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.

λ‹€μ΄λ‚˜λ―Ή λ©”μ„œλ“œ λ””μŠ€νŒ¨μΉ˜(Dynamic Method Dispatch)

β€’
λŸ°νƒ€μž„μ‹œμ— μ‹€μ œ 객체 확인 ν›„ 객체에 바인딩
β€’
Java의 λ‹€ν˜•μ„±μ΄ κ°€λŠ₯ν•˜λ„λ‘ ν•΄μ£ΌλŠ” 밑바탕이닀
β€’
ex) Employee e = new Engineer(); e.getInformation() Compile time : Employee의 getInfo둜 κ°„μ£Ό Runtime : Engineer의 getInfo둜 κ°„μ£Ό (μƒμ„±ν•œ 주체가 Engineerλ‹ˆκΉŒ Engineer꺼둜!!)
β€’
μ›λž˜λŠ” μƒμœ„ νƒ€μž…μœΌλ‘œ ν•˜μœ„ νƒ€μž… 객체λ₯Ό μ°Έμ‘°ν•  λ•Œ μƒμœ„ νƒ€μž…μ˜ κΈ°λŠ₯밖에 μ‚¬μš© λΆˆκ°€ (μ»΄νŒŒμΌλŸ¬κ°€ ν—ˆμš©μ„ μ•ˆν•΄μ„œ) β‡’ 동적 바인딩을 톡해 ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λœ λ©”μ„œλ“œ μ‚¬μš© κ°€λŠ₯!! β‡’ μ˜€λ²„λΌμ΄λ”©μ˜ μ€‘μš”μ„± ( λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 껍데기라도 λ§Œλ“œλŠ” 이유)

좔상 클래슀(abstract class)

β€’
좔상 λ©”μ„œλ“œ γ„΄ μžμ† ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ μž¬μ •μ˜ν•΄μ„œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ‘°μƒμ˜ κ΅¬ν˜„μ΄ λ¬΄μ˜λ―Έν•œ λ©”μ„œλ“œ γ„΄ λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ 남기고, κ΅¬ν˜„λΆ€λŠ” μ„Έλ―Έμ½œλ‘ μœΌλ‘œ λŒ€μ²΄ γ„΄ κ΅¬ν˜„λΆ€κ°€ μ—†λ‹€λŠ” 의미둜 abstract ν‚€μ›Œλ“œλ₯Ό λ©”μ„œλ“œ 선언뢀에 μΆ”κ°€ γ„΄ 객체λ₯Ό 생성할 수 μ—†λŠ” ν΄λž˜μŠ€λΌλŠ” 의미둜 크래슀 선언뢀에 abstract μΆ•
β€’
좔상 클래슀의 νŠΉμ§• γ„΄ ν΄λž˜μŠ€μ— κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œκ°€ μžˆμœΌλ―€λ‘œ 객체λ₯Ό 생성할 수 μ—†μŒ γ„΄ ν•˜μ§€λ§Œ μƒμœ„ 클래슀 νƒ€μž…μœΌλ‘œμ¨ μžμ‹ μ°Έμ‘°λŠ” κ°€λŠ₯! ex) Vehicle v = new Vehicle(); β†’ X Vehicle v = new DiselSUV(); β†’ O
β€’
좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 이유 γ„΄ abstract classλŠ” κ΅¬ν˜„μ˜ κ°•μ œλ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚΄ γ„΄ μΈν„°νŽ˜μ΄μŠ€μ— μžˆλŠ” λ©”μ„œλ“œ 쀑 κ΅¬ν˜„ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄ 편의λ₯Ό 지원

final ν‚€μ›Œλ“œ

β€’
μ›μ‹œ νƒ€μž…
β—¦
둜컬 μ›μ‹œ λ³€μˆ˜μ— final둜 μ„ μ–Έν•˜λ©΄ ν•œλ²ˆ μ΄ˆκΈ°ν™”λœ λ³€μˆ˜λŠ” λ³€κ²½ν•  수 μ—†λŠ” μƒμˆ˜κ°’μ΄ λ©λ‹ˆλ‹€.
@Test public void test_final_primitive_variables() { final int x = 1; //x = 3; //ν•œλ²ˆ assign되면 λ³€κ²½ν•  수 μ—†μŒ. }
Java
볡사
β€’
객체 νƒ€μž…
β—¦
객체 λ³€μˆ˜μ— final둜 μ„ μ–Έν•˜λ©΄ κ·Έ λ³€μˆ˜μ— λ‹€λ₯Έ μ°Έμ‘° 값을 지정할 수 μ—†μŠ΅λ‹ˆλ‹€. μ›μ‹œ νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ ν•œλ²ˆ 쓰여진 λ³€μˆ˜λŠ” μž¬λ³€κ²½ λΆˆκ°€ν•©λ‹ˆλ‹€. 단, 객체 μžμ²΄κ°€ immutableν•˜λ‹€λŠ” μ˜λ―ΈλŠ” μ•„λ‹™λ‹ˆλ‹€. 객체의 속성은 λ³€κ²½ κ°€λŠ₯ν•©λ‹ˆλ‹€.
@Test public void test_final_reference_variables() { final Pet pet = new Pet(); // pet = new Pet(); //λ‹€λ₯Έ 객체둜 λ³€κ²½ν• μˆ˜ μ—†μŒ pet.setWeight(3); //객체 ν•„λ“œλŠ” λ³€κ²½ν•  수 있음 }
Java
볡사
β€’
λ©”μ„œλ“œ 인자
β—¦
λ©”μ„œλ“œ μΈμžμ— final ν‚€μ›Œλ“œλ₯Ό 뢙이면, λ©”μ„œλ“œ μ•ˆμ—μ„œ λ³€μˆ˜κ°’μ„ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
public class Pet { int weight; public void setWeight(final int weight) { // weight = 1; //final μΈμžλŠ” λ©”μ„œλ“œμ•ˆμ—μ„œ λ³€κ²½ν•  수 μ—†μŒ } }
Java
볡사

Object 클래슀

μ΅œμƒμœ„ 클래슀이며, λͺ¨λ“  ν΄λž˜μŠ€λŠ” λ¬΅μ‹œμ μœΌλ‘œ Object 클래슀λ₯Ό μƒμ†λ°›κ²Œ λœλ‹€.
μ£Όμš” λ©”μ„œλ“œ
β€’
equals(), toString(), clone() λ“± μœ ν‹Έ λ©”μ„œλ“œ
β€’
wait(), notify(), notifyAll() λ“± μŠ€λ ˆλ“œ κ΄€λ ¨ λ©”μ„œλ“œ
β€’
finalize() : GC μ „ λ¦¬μ†ŒμŠ€λ₯Ό λ°˜ν™˜ν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ
β€’
hashcode() : ν•΄λ‹Ή 객체의 μ°Έμ‘° 값을 λ‚˜νƒ€λ‚΄λŠ” λ©”μ„œλ“œ