λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
β˜•Java

[Java μ΄ν•΄ν•˜κΈ°] 21. Java의 상속

by Luvbit 2024. 5. 31.

🩷 μ—„λ§ˆν† λΌ 아기토끼 🩷


 

🩷 Java의 μƒμ†μ΄λž€?

상속은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›λŠ” κΈ°λŠ₯을 λ§ν•©λ‹ˆλ‹€.
상속을 톡해 μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ 높이고, μ½”λ“œλ₯Ό 효율적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

πŸ’›

μœ„μ— 두 마리의 토끼가 λ³΄μ΄μ‹œλ‚˜μš”? μ—„λ§ˆν† λΌμ™€ 아기토끼가 μžˆμŠ΅λ‹ˆλ‹€.
이 두 토끼λ₯Ό μΆ”μƒν™”ν•˜μ—¬ 객체λ₯Ό λ§Œλ“ λ‹€κ³  ν–ˆμ„ λ•Œ, 두 ν† λΌμ˜ 곡톡점이 λ¬΄μ—‡μΌκΉŒμš”?

 

λ‘˜ λ‹€ ν† λΌλΌλŠ” μ μž…λ‹ˆλ‹€.

ν† λΌμ˜ νŠΉμ§•μ„ 2κ°€μ§€λ§Œ λ½‘μ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. ν† λΌλŠ” κΉ‘μΆ©κΉ‘μΆ© λ›°λ©°, 당근을 μ’‹μ•„ν•©λ‹ˆλ‹€.

(μ‹€μ œ 사싀과 무관할 수 μžˆμŠ΅λ‹ˆλ‹€.)

 

μ—¬κΈ°μ„œ, μ €λ²ˆμ‹œκ°„μ— λ°°μ› λ˜ has-a 관계λ₯Ό λ– μ˜¬λ € λ΄…μ‹œλ‹€. 'OO은 OOλ₯Ό 가진닀'λΌλŠ” κ°œλ…μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

상속은 has-a 관계와 μ•½κ°„ λ‹€λ¦…λ‹ˆλ‹€. ν”νžˆ is-a라고 ν•©λ‹ˆλ‹€. 'OO은 OO이닀'λΌλŠ” κ°œλ…μž…λ‹ˆλ‹€.

 

'μ•„κΈ° ν† λΌλŠ” 토끼λ₯Ό 가진닀' vs 'μ•„κΈ° ν† λΌλŠ” 토끼이닀.' μ–΄λ–€ ν‘œν˜„μ΄ μžμ—°μŠ€λŸ¬μš°μ‹ κ°€μš”?

μ•„λ§ˆ λŒ€λΆ€λΆ„ ν›„μžκ°€ 더 μžμ—°μŠ€λŸ½λ‹€κ³  λŒ€λ‹΅ν•˜μ‹€ κ²λ‹ˆλ‹€. μ΄λ ‡κ²Œ is-a 관계일 λ•Œ 상속을 μ‚¬μš©ν•©λ‹ˆλ‹€.

 

ν† λΌλΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν† λΌλΌλŠ” ν΄λž˜μŠ€μ—λŠ” 당근을 λ¨ΉλŠ” λ©”μ„œλ“œμ™€ κΉ‘μΆ©κΉ‘μΆ© λ›°λŠ” λ©”μ„œλ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€..

λ§Œμ•½ 아기토끼와 μ—„λ§ˆν† λΌκ°€ 이 ν† λΌν΄λž˜μŠ€λ₯Ό μƒμ†λ°›κ²Œ 되면, λ©”μ„œλ“œλ₯Ό λ‹€μ‹œ μ •μ˜ν•  ν•„μš” 없이 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.

 

좔후에 μ•„κΈ°ν† λΌμ˜ ν˜•μ œλ“€μ΄ λŠ˜μ–΄λ‚˜λ„, 당근을 λ¨ΉλŠ” λ©”μ„œλ“œμ™€ κΉ‘μΆ©κΉ‘μΆ© λ›°λŠ” λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  ν•„μš”κ°€ μ—†κ²Œ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

μžμ„Έν•œ 건 μ•„λž˜μ—μ„œ μ„€λͺ…λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. 

🐰

 

 

 

 

상속(Inheritance)은 ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›μ•„ μž¬μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

상속을 톡해 μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 멀버 (ν•„λ“œμ™€ λ©”μ„œλ“œ)λ₯Ό μ‚¬μš©ν•  수 있으며, ν•„μš”μ— 따라 이λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΆ€λͺ¨ 클래슀 (Superclass) : 속성과 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ— μ œκ³΅ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
μžμ‹ 클래슀 (SubClass) :λΆ€λͺ¨ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό 상속받아 μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
extends ν‚€μ›Œλ“œ :Javaμ—μ„œ 상속을 μ„ μ–Έν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

 

 

 

 

 

β€οΈμƒμ†μ˜ νŠΉμ§•

μ½”λ“œ μž¬μ‚¬μš© μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆμ–΄ 쀑볡 μ½”λ“œλ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
ν™•μž₯μ„± κΈ°μ‘΄ 클래슀λ₯Ό ν™•μž₯ν•˜μ—¬ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λ‹€ν˜•μ„±(Polymorphism) λΆ€λͺ¨ 클래슀둜 μ„ μ–Έλœ 객체가 μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆμ–΄ λ‹€μ–‘ν•œ 객체λ₯Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
단일 상속 JavaλŠ” 단일 μƒμ†λ§Œμ„ μ§€μ›ν•˜λ©°, ν•œ ν΄λž˜μŠ€λŠ” 였직 ν•˜λ‚˜μ˜ λΆ€λͺ¨ 클래슀λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 닀쀑 μƒμ†μ˜ 효과λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄μ„œλŠ” 좔후에 μ„€λͺ…λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

πŸ©·μƒμ†μ˜ μž₯점

 

  1. μœ μ§€λ³΄μˆ˜ 용이 :  μ½”λ“œμ˜ 쀑볡을 쀄여 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•©λ‹ˆλ‹€.
  2. 계측적 ꡬ쑰 : 논리적인 계측 ꡬ쑰λ₯Ό ν˜•μ„±ν•˜μ—¬ μ½”λ“œμ˜ 이해와 관리가 μš©μ΄ν•©λ‹ˆλ‹€.
  3. μž¬μ‚¬μš©μ„± : κΈ°μ‘΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜μ—¬ 개발 μ‹œκ°„μ„ λ‹¨μΆ•ν•˜κ³  νš¨μœ¨μ„±μ„ λ†’μž…λ‹ˆλ‹€.
  4. λ‹€ν˜•μ„± 지원 : λ‹€ν˜•μ„±μ„ 톡해 μœ μ—°ν•œ μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

 

 

 

 

 

 

 


상속 예제)

상속에 λŒ€ν•΄μ„œ μ˜ˆμ œμ™€ ν•¨κ»˜ μ„€λͺ…λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

μ•„λž˜λŠ” 토끼 클래슀 , λΆ€λͺ¨ ν΄λž˜μŠ€μž…λ‹ˆλ‹€ (Super Class)

 

 

 

 

Rabbit.java

// λΆ€λͺ¨ 클래슀
class Rabbit {
   public void jump() {
        System.out.println("The rabbit jumps.");
    }

   public void eatCarrot() {
        System.out.println("The rabbit eats a carrot.");
    }
}

 

 

 

 

BabyRabbit.java

//μžμ‹ 클래슀
class BabyRabbit extends Rabbit {
    public void play() {
        System.out.println("The baby rabbit plays.");
    }
}

 

 

 

 

MotherRabbit.java

// μžμ‹ 클래슀
class MotherRabbit extends Rabbit {
    public void careForBabies() {
        System.out.println("The mother rabbit cares for her babies.");
    }
}

 

 

 

 

Main.java

public class Main {
    public static void main(String[] args) {
        BabyRabbit babyRabbit = new BabyRabbit();
        MotherRabbit motherRabbit = new MotherRabbit();

        // λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ 호좜
        babyRabbit.jump();
        babyRabbit.eatCarrot();
        babyRabbit.play();

        // λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œ 호좜
        motherRabbit.jump();
        motherRabbit.eatCarrot();
        motherRabbit.careForBabies();
    }
}

 

 

이 μ˜ˆμ œμ—μ„  μ•„κΈ° ν† λΌλ§Œμ˜ λ©”μ„œλ“œμ™€, μ—„λ§ˆ ν† λΌλ§Œμ˜ λ©”μ„œλ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ§Œ 'jump'와 'eatCarrot' λ©”μ„œλ“œλŠ” μž¬μ •μ˜ν•  ν•„μš” 없이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

 


 

 

 

 

" μš”μ•½ " 

  • 상속은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜λ‘œ, κΈ°μ‘΄ 클래슀의 속성과 λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›μ•„ μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 μ½”λ“œ μž¬μ‚¬μš©μ„±μ„ 높이고, 계측 ꡬ쑰λ₯Ό ν˜•μ„±ν•˜μ—¬ μ½”λ“œμ˜ 관리와 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ ν•©λ‹ˆλ‹€.
  • Javaμ—μ„œλŠ” 'extends' ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 상속을 κ΅¬ν˜„ν•˜λ©°, 단일 μƒμ†λ§Œμ„ μ§€μ›ν•©λ‹ˆλ‹€.

 

 

 

 

 

 

 

 

JavaλŠ” 100% μƒμ†κ΅¬μ‘°μž…λ‹ˆλ‹€.
λͺ¨λ“  ν΄λž˜μŠ€λŠ” 객체λ₯Ό 상속받고 μžˆμŠ΅λ‹ˆλ‹€.
상속에 λŒ€ν•΄μ„  κΌ­ μˆ™μ§€ν•΄μ£Όμ„Έμš”!

μ§ˆλ¬Έμ€ μ–Έμ œλ“ μ§€ λŒ“κΈ€μ— λ‚¨κ²¨μ£Όμ„Έμš”.
🩡🐰🩡