λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ‹œλ„/ꡭ비지원

[D+18] 상속

by πŸ‡λ°•λ΄‰λ΄‰πŸ‡ 2022. 10. 18.

 

ꡭ비지원 D+18

- 상속 -

 


 

상속

μš°λ¦¬κ°€ κ°€μž₯ ν”νžˆ μ•Œκ³ μžˆλŠ” μš©μ–΄μ˜ ν•΄μ„μ°¨μ›μ—μ„œ 상속은 μžμ‹μ—κ²Œ λ¬Όλ €μ€€λ‹€λŠ” 의미λ₯Ό 가지고 μžˆλ‹€.
μ΄λŸ¬ν•œ μƒμ†μ˜ μ˜λ―Έλ„ 틀린것은 μ•„λ‹ˆμ§€λ§Œ μš°λ¦¬κ°€ μ•Œμ•„μ•Όν•  기계적인 의미둜 ν•΄μ„ν•˜λ©΄ 상속은 λ©”λͺ¨λ¦¬ λΈ”λ‘μ˜ 결합을 μ˜λ―Έν•œλ‹€.
즉, 상속은 Heapμ˜μ—­μ—μ„œμ˜ λ©”λͺ¨λ¦¬ 결합이라고 ν•  수 μžˆλ‹€.

μƒμ†μ˜ μž₯/단점

λ¨Όμ € μƒμ†μ˜ μž₯점은 μž¬ν™œμš©μ μΈ 츑면이 μžˆλ‹€λŠ” 것이닀.
예λ₯Ό λ“€μ–΄ μ„€λͺ…ν•΄ 보자면, λ§Œμ•½ μš°λ¦¬κ°€ 동물병원 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€λ•Œ 상속이 없을 κ²½μš°μ—” 동물듀은 진찰을 받을 λ•Œ 항상 피검사λ₯Ό λ°›μ•„μ•Ό ν•˜λŠ”λ° λ“€μ–΄μ˜€λŠ” λ™λ¬Όλ§ˆλ‹€ 피검사λ₯Ό 맀번 λ„£μ–΄μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμ„ 것이닀.

그런데 우츑 그림처럼 맀번 피검사λ₯Ό λ™λ¬Όμ•ˆμ— λ„£μ–΄μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ ν”Όκ²€μ‚¬λΌλŠ” 클래슀λ₯Ό λ§Œλ“  λ‹€μŒμ— λ™λ¬Όλ“€μ—κ²Œ 상속해쀀닀면 λ™λ¬Όλ“€μ—κ²Œ 맀번 피검사λ₯Ό μž…λ ₯ν•˜μ§€ μ•Šμ•„λ„ 될 뿐만 μ•„λ‹ˆλΌ μƒˆλ‘œ μ˜€λŠ” λ™λ¬Όλ“€μ—κ²Œλ„ μ μš©λ˜μ–΄ μž¬ν™œμš©μ μΈ μΈ‘λ©΄μ—μ„œ νŽΈλ¦¬ν•˜λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 상속에도 단점이 μ‘΄μž¬ν•˜λŠ”λ° λ§Œμ•½μ— ν˜ˆμ•‘κ²€μ‚¬ ν΄λž˜μŠ€μ— 인간이 피검사λ₯Ό λ°›μœΌλ €κ³  ν˜ˆμ•‘κ²€μ‚¬ 클래슀λ₯Ό μƒμ†λ°›μœΌλ €κ³  ν•  λ•Œ 상속이 κ°€λŠ₯ν•˜κ²Œ 처리될 경우 이건 μ½”λ“œμ—μ„œ λ¬Έμ œκ°€ λ˜μ§€λŠ” μ•Šμ§€λ§Œ μƒμ‹μ μœΌλ‘œ λ™λ¬Όλ³‘μ›μ—μ„œ 인간이 피검사λ₯Ό λ°›λŠ”κ±΄ μ΄ν•΄λ˜κΈ° μ–΄λ ΅λ‹€.
μ΄λ ‡κ²Œ 정책이 λΆ€μž¬ν•œ μž¬ν™œμš©μ„ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ λ°œμƒλ  수 μžˆλ‹€λŠ” 것이닀.

상속 섀계 κΈ°μ€€

μœ„μ˜ μƒμ†μ˜ λ‹¨μ μ²˜λŸΌ 정책이 λΆ€μž¬ν•œ μž¬ν™œμš© μ‚¬μš©μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ μš°λ¦¬λŠ” 상속을 잘 μ§œκΈ°μœ„ν•œ 3가지 관계λ₯Ό κ³ λ €ν•΄μ•Όν•œλ‹€.

• is a 관계

- κ³ μ–‘μ΄λŠ” 동물이닀.
- μ‚¬μžλŠ” 동물이닀.

• is a kind of 관계

- κ³ μ–‘μ΄λŠ” λ™λ¬Όμ˜ μ’…λ₯˜μ΄λ‹€.
- μ‚¬μžλŠ” λ™λ¬Όμ˜ μ’…λ₯˜μ΄λ‹€.

• has a 관계

- μš©μ‚¬λŠ” 무기λ₯Ό κ°€μ§€κ³ μžˆλ‹€.
=> has a κ΄€κ³„λŠ” ν‘œν˜„μ€ κ°€λŠ₯ν•˜μ§€λ§Œ ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ 상속을 κ΅¬ν˜„ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  ν•œλ‹€.
=> has a 관계에 μ„±λ¦½λ˜λŠ” 값을 is a κ΄€κ³„λ‚˜ is a kind of 관계에 λŒ€μž…ν•΄ 확인해보면 λ‹€μ†Œ κ΄΄λž„ν•¨μ΄ 있기 λ•Œλ¬Έμ΄λ‹€.

ꡬ쑰

κ·Έλ¦Όκ³Ό 같이 개, 고양이, μ›μˆ­μ΄κ°€ Animal에 μ†ν•˜λŠ” 이런 관계λ₯Ό 상속관계라고 ν•˜λ©°, μ΄λ•Œμ˜ Animal은 λΆ€λͺ¨ν΄λž˜μŠ€λΌκ³  ν•˜λ©°, 개, 고양이, μ›μˆ­μ΄ 같은 ν•˜λ‹¨ ν΄λž˜μŠ€λŠ” μžμ‹ν΄λž˜μŠ€λΌκ³  ν•œλ‹€.

문법

// λΆ€λͺ¨ 클래슀
class Parent(){
	...
}

// μžμ‹ 클래슀
class Child extends Parent(){
	...
}

μ‚¬μš©λ°©λ²•μ€ 상속받고 싢은 μžμ‹ ν΄λž˜μŠ€μ˜†μ— extends λΆ€λͺ¨ν΄λž˜μŠ€ λ₯Ό λΆ™μ—¬μ€˜μ„œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

extendsλ₯Ό μ‚¬μš©ν•΄μ„œ μœ„μ—μ²˜λŸΌ 상속을 ν•΄μ£Όμ—ˆλ‹€λ©΄ Parent와 Child λ‘ν΄λž˜μŠ€λŠ” λ©”λͺ¨λ¦¬κ°€ ν•©μ³μ§€κ²Œ 되며 Parent의 μ†μ„±μ΄λ‚˜ λ©”μ†Œλ“œλ₯Ό μΆ”κ°€μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ Child ν΄λž˜μŠ€κ°€ λ˜λŠ” 것이닀.

// λΆ€λͺ¨ 클래슀
class Parent(){
	...
}

// μžμ‹ 클래슀
class Child extends Parent(){

	// static을 μ‚¬μš©ν•œ ν•„λ“œ
    private static int num;
    
    // static을 μ‚¬μš©ν•œ λ©”μ†Œλ“œ
    public static int getNum()
    {
    	...
     }

	...
}

μ΄λ•Œ 상속이 μΌμ–΄λ‚˜κ³  μžˆλŠ” μ‹œμ μ—μ„œ λΆ€λͺ¨ν΄λž˜μŠ€λ‚˜ μžμ‹ν΄λž˜μŠ€μ— static으둜 μ§€μ •λœ ν•„λ“œλ‚˜ λ©”μ†Œλ“œκ°€ μžˆλŠ”κ²½μš° static 같은 경우 Global μ˜μ—­μ— λ“€μ–΄κ°€κΈ° λ•Œλ¬Έμ— μƒμ†μ˜ λ©”μΉ΄λ‹ˆμ¦˜κ³ΌλŠ” λ³„κ°œλ‘œ 생각해주면 λœλ‹€.

μƒμ„±μžλ₯Ό 톡해 μ•Œμ•„λ³΄λŠ” μƒμ†ν΄λž˜μŠ€μ˜ μ ‘κ·Ό μˆœμ„œ

λ‹€μŒμ€ Animalμ΄λΌλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° Dogκ°€ 상속받은 μ½”λ“œλ₯Ό λ³΄μ—¬μ£ΌλŠ” λͺ¨μŠ΅μ΄λ‹€.
μ΄λ•Œ 각 μƒμ„±μžμ— μƒμ„±μžκ°€ μ‹€ν–‰λ˜μ—ˆμ„ λ•Œ μ‹€ν–‰λ˜μ—ˆλ‹€λŠ” 문ꡬλ₯Ό 좜λ ₯ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€μ μœΌλ‘œ μž‘μ„±ν•΄ μ€€ λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

μ΄λ•Œ λ§Œμ•½μ— Main.java 6번째 μ€„μ—μ„œ Dog()객체λ₯Ό 생성해 μ£Όμ—ˆμ„λ•Œ κ³Όμ—° μ–΄λ–€ ν΄λž˜μŠ€μ— μžˆλŠ” 값이 λ¨Όμ € 좜λ ₯되게 될까?

일단 닡은 Animal → Dog 순으둜 호좜이 μ§„ν–‰λœλ‹€λŠ” 것을 μ½˜μ†”μ°½μ„ 톡해 확인할 수 μžˆμ—ˆλ‹€.

그런데 더 λ‚˜μ•„κ°€μ„œ Main.java의 6번째 쀄에 브레이크 포인트λ₯Ό 작고 디버깅을 λŒλ Έμ„λ•ŒλŠ” 쑰금 λ‹€λ₯Έ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€.
디버깅을 돌리면 λ¨Όμ € Dog의 κΈ°λ³Έμƒμ„±μžλ‘œ κ°€κ²Œλœλ‹€.
그런데 Dog의 κΈ°λ³Έμƒμ„±μž μ•ˆμ— λ“€μ–΄κ°€ 값을 μ΄ˆκΈ°ν™”ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ‹€μŒμ— Animal의 κΈ°λ³Έμƒμ„±μžλ‘œ μ΄λ™ν•˜λ©° μ΄λ•ŒλΆ€ν„° μ°¨λ‘€λ‘œ 값을 μ΄ˆκΈ°ν™”ν•˜κ³  싀행문ꡬλ₯Ό 좜λ ₯ν•œ λ‹€μŒ Dog의 κΈ°λ³Έμƒμ„±μž μ•ˆμœΌλ‘œ λ“€μ–΄κ°€ 값을 μ΄ˆκΈ°ν™”ν•˜κ³  싀행문ꡬλ₯Ό 좜λ ₯ν•˜λŠ” 순으둜 μƒμ„±μžλ₯Ό μ ‘κ·Όν•˜μ˜€λ‹€.

이둜써 μš°λ¦¬λŠ” 호좜 μˆœμ„œμ™€ 호좜되기 μ΄μ „κΉŒμ§€μ˜ μˆœμ„œλ₯Ό κ΅¬λΆ„μ§€μ–΄μ„œ μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

super()

super에 λŒ€ν•΄μ„œ 본격적으둜 μ•Œμ•„λ³΄κΈ° μœ„ν•΄ superλΌλŠ” 것이 μ™œ ν•„μš”ν•œμ§€μ— λŒ€ν•΄μ„œ μ•Œ ν•„μš”κ°€ μžˆλ‹€.

μš°λ¦¬κ°€ μ—¬νƒœ λ°°μ›Œμ˜¨ μƒμ†μ˜ νŠΉμ§•μ€ λΆ€λͺ¨ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ†λ°›μœΌλ©΄ λ”°λ‘œ μ„ μ–Έ 없이 λΆ€λͺ¨ν΄λž˜μŠ€μ˜ ν•„λ“œλ‚˜ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€κ³  λ°°μ› λ‹€.
κ·Έλž˜μ„œ Dog 클래슀 ν•„λ“œμ™€ Animal 클래슀 ν•„λ“œκ°’μ„ mainμœΌλ‘œλΆ€ν„° λ°›μ•„μ˜€λ©΄ μ–΄μ°¨ν”Ό Animal ν•„λ“œλŠ” μƒμ†λ˜μ–΄μžˆλŠ” μƒνƒœλΌ μœ„μ˜ 보기처럼 this처리λ₯Ό κ±°μ³μ„œ 값을 μ΄ˆκΈ°ν™” ν•΄μ€˜λ„ λœλ‹€κ³  생각할 수 μžˆλ‹€.
λ¬Όλ‘  λΉŒλ“œλ₯Ό μ‹œν‚€λ©΄ λ¬Έμ œμ—†μ΄ 잘 λŒμ•„κ°€λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€.

ν•˜μ§€λ§Œ μš°λ¦¬κ°€ μž μ‹œ μžŠμ€κ²Œ μžˆλŠ”λ° μ™œ μš°λ¦¬λŠ” μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμΌκΉŒ?
μš°λ¦¬κ°€ μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ ν•΄λ‹Ή 객체λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ£ΌλŠ” 것이닀.
그런데 μœ„μ˜ μ½”λ“œμ²˜λŸΌ λ‚΄ 객체가 μ•„λ‹Œ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ κ°μ²΄κΉŒμ§€ μ΄ˆκΈ°ν™”λ₯Ό μ§„ν–‰ν•΄μ£ΌλŠ” 것은 μ•½κ°„μ˜ μ•„μ΄λŸ¬λ‹ˆν•¨μ΄ μžˆλ‹€λŠ” 것이닀.
λ˜ν•œ μ§€κΈˆμ€ λ°›λŠ” νŒŒλΌλ―Έν„°κ°€ 적어 ν•¨κ»˜ μ΄ˆκΈ°ν™”λ₯Ό ν•΄ μ€„μˆ˜λŠ” μžˆμ„μ§€ λͺ°λΌλ„ λ§Œμ•½ λΆ€λͺ¨ν΄λž˜μŠ€μ˜ νŒŒλΌλ―Έν„°μ˜ κ°œμˆ˜κ°€ μ—„μ²­λ‚œ 양이라면 μžμ‹ ν΄λž˜μŠ€μ—λ‹€κ°€ μ΄ˆκΈ°ν™”λ₯Ό ν•˜λŠ”κ±΄ 무리이닀.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μš°λ¦¬λŠ” 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ superλ₯Ό μ‚¬μš©ν•΄ μ£ΌλŠ” 것이닀.
superλŠ” λΆ€λͺ¨κ°μ²΄μ˜ 참쑰값을 λ‚˜νƒ€λ‚΄λ©° super의 νŒŒλΌλ―Έν„°λ‘œ λΆ€λͺ¨ν΄λž˜μŠ€λ‘œ λ„˜μ–΄κ°€μ•Όν•  값듀을 λ„˜κ²¨μ£Όκ²Œλ˜λ©΄ λΆ€λͺ¨ν΄λž˜μŠ€λŠ” νŒŒλΌλ―Έν„°λ‘œ 받은 값을 μ΄ˆκΈ°ν™”ν•΄μ£Όλ©΄ λ˜λŠ” 것이닀.

μ΄λ•Œ μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점은 μƒμ„±μžμ•ˆμ— λ°˜λ“œμ‹œ κ°€μž₯λ¨Όμ € μž‘μ„±ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
μˆœμ„œλ₯Ό λ°”κΏ”μ„œ 객체 값을 μ΄ˆκΈ°ν™”ν•œν›„ superλ₯Ό μž‘μ„±ν•΄ μ€€λ‹€λ©΄ 였λ₯˜κ°€ λ°œμƒλ˜λ‹ˆ 이점 κΌ­ μ°Έκ³ ν•˜λ„λ‘ ν•œλ‹€.

상속은 λ°˜λ“œμ‹œ ν•„μš”ν• κΉŒ?

μ½”λ“œλ₯Ό μž‘μ„±ν• λ•Œ 상속ꡬ쑰가 ν•„μš”ν•˜μ§€λ§Œ μƒμ†κ΅¬μ‘°λ‘œ μ½”λ“œμž‘μ„±μ‹œ νŠΉλ³„ν•œ 이점이 없을 경우 λ°˜λ“œμ‹œ 상속을 λ§Œλ“€μ–΄μ•Όν• κΉŒ?
정닡은 μ•„λ‹ˆλ‹€.
상속이 객체지ν–₯μ–Έμ–΄μ˜ νŠΉμ„±μ€‘ ν•˜λ‚˜λΌκ³  ν•΄μ„œ 상속을 λ°˜λ“œμ‹œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.
μš°λ¦¬κ°€ 상속을 μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” κΈ°μ‘΄ μ½”λ“œμ™€λŠ” λ‹€λ₯΄κ²Œ 이점이 있기 λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ”κ²ƒμœΌλ‘œ 이점이 μ—†λ‹€λ©΄ ꡳ이 μ‚¬μš©ν•  ν•„μš”κ°€ μ—†λ‹€.
(= 이점이 μ—†λ‹€λŠ”κ±΄ μ½”λ“œμ˜ λ³΅μž‘λ„κ°€ κ·Έλ ‡κ²Œ 높지 μ•Šλ‹€λŠ” 말이기도 ν•˜λ‹€)

단, ν΄λž˜μŠ€λ“€κ°„μ— κ²ΉμΉ˜λŠ” 뢀뢄이 μ–΄λŠμ •λ„ λˆˆμ— 보인닀면 μœ μ§€λ³΄μˆ˜λ₯Ό μœ„ν•΄μ„œλΌλ„ μ‚¬μš©ν•΄ μ£ΌλŠ”κ²ƒ 이 μ’‹λ‹€.
λŒ€μ‹  상속을 μ‚¬μš©μ€‘μ— 버그가 λ°œμƒλ˜μ—ˆμ„ μ‹œμ— μƒμ†λœ ν΄λž˜μŠ€λ“€λΌλ¦¬ μ—λŸ¬μŠ€ν”„λ ˆλ“œκ°€ λ°œμƒλ  수 있기 λ•Œλ¬Έμ— μ‘°μ‹¬ν•΄μ„œ 잘 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

λ°˜μ‘ν˜•

λŒ“κΈ€