λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Java

[Java] 상속(Inheritance)에 λŒ€ν•΄μ„œ

by jaee_ 2021. 8. 14.

πŸ“š 이전에 μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ˜ 차이점에 λŒ€ν•΄μ„œ 글을 μž‘μ„±ν–ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” μ˜€λ²„λΌμ΄λ”©μ— λŒ€ν•΄μ„œ 더 ν™•μ‹€ν•˜κ²Œ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ 상속에 λŒ€ν•œ 정리λ₯Ό 해보렀고 ν•œλ‹€. 


μžλ°”μ—μ„œ μƒμ†μ΄λž€?

일반적으둜 μƒκ°ν–ˆμ„ λ•Œ μƒμ†μ΄λž€ 무언가λ₯Ό λΆ€λͺ¨μ—κ²Œ λ¬Όλ €λ°›λŠ” 것을 λ§ν•œλ‹€.

Javaμ—μ„œμ˜ 상속도 λΉ„μŠ·ν•˜λ‹€. λΆ€λͺ¨ν΄λž˜μŠ€μ˜ λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό 상속을 톡해 μžμ‹ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

 

쑰금 더 깊게 λ§ν•˜μžλ©΄, 기쑴의 ν΄λž˜μŠ€μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜ μž¬μ •μ˜ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.(ν™•μž₯의 κ°œλ…)

μ΄λ•Œ 기쑴에 μ •μ˜λ˜μ–΄ 있던 클래슀λ₯Ό λΆ€λͺ¨ν΄λž˜μŠ€(parent class) λ˜λŠ” μƒμœ„ν΄λž˜μŠ€(super class)라고 λΆ€λ₯΄λ©°, 상속을 톡해 μƒˆλ‘­κ²Œ μž‘μ„±λ˜λŠ” 클래슀λ₯Ό μžμ‹ν΄λž˜μŠ€(child class) λ˜λŠ” ν•˜μœ„ν΄λž˜μŠ€(sub class)라고 ν•œλ‹€.

 

🎈 상속은 λΆ€λͺ¨-μžμ‹ν΄λž˜μŠ€ κ°„μ˜ 결합도가 κ°•ν•˜κΈ° λ•Œλ¬Έμ— is-aκ΄€κ³„μ—μ„œ μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ νš¨μœ¨μ μ΄λ‹€. 
is-a관계(is a relationship, inheritance)λŠ” 일반적인 κ°œλ…κ³Ό ꡬ체적인 κ°œλ…μ˜ 관계이닀.
예λ₯Όλ“€λ©΄,
 - μ‚¬λžŒμ€ 동물이닀.  
 - μ†ŒλŠ” 동물이닀.
 - κ°•μ•„μ§€λŠ” 동물이닀. 

 

Java μƒμ†μ˜ νŠΉμ§•

  • 상속은 extendsλΌλŠ” μ˜ˆμ•½μ–΄λ‘œ μ •μ˜ν•  수 μžˆλ‹€.
  • ν•˜λ‚˜μ˜ λΆ€λͺ¨ν΄λž˜μŠ€λŠ” μ—¬λŸ¬κ°œμ˜ μžμ‹ 클래슀λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. λ°˜λŒ€λ‘œ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” μ—¬λŸ¬κ°œμ˜ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 받을 μˆ˜λŠ” μ—†λ‹€.(닀쀑상속 λΆˆκ°€)
  • μžμ‹ν΄λž˜μŠ€λŠ” 또 λ‹€λ₯Έ 클래슀의 λΆ€λͺ¨ν΄λž˜μŠ€κ°€ 될 수 μžˆλ‹€.
  • μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€λ‘œλΆ€ν„° 물렀받은 μžμ›μ„ overrideν•˜μ—¬ μˆ˜μ •ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.(μ ‘κ·Όμ œμ–΄μžκ°€ public, protected인 것에 ν•œν•΄μ„œ)
  • λΆ€λͺ¨ν΄λž˜μŠ€κ°€ 상속받은 μžμ›λ„ μžμ‹ν΄λž˜μŠ€κ°€ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

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

  • 기쑴에 μž‘μ„±λœ 클래슀λ₯Ό μž¬ν™œμš©ν•  수 μžˆλ‹€.(쀑볡을 쀄일 수 μžˆλ‹€)
  • ν™•μž₯성이 μ¦κ°€ν•œλ‹€.
  • 클래슀 κ°„μ˜ 계측적 관계λ₯Ό κ΅¬μ„±ν•¨μœΌλ‘œμ¨ λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.
  • 개발 μ‹œκ°„μ΄ λ‹¨μΆ•λœλ‹€.

μƒμ†μ˜ 문제점

  • μΊ‘μŠν™”λ₯Ό κΉ¨λœ¨λ¦°λ‹€. 
  • μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ν΄λž˜μŠ€μ— κ°•ν•˜κ²Œ κ²°ν•© 및 μ˜μ‘΄ν•˜κ²Œ λœλ‹€.

 

λ‹€μŒ μ½”λ“œλ₯Ό 톡해 상속에 λŒ€ν•œ 이해λ₯Ό λ„μ™€λ³΄μž.

package Inheritance;

public class Inheritance {

    // λΆ€λͺ¨ν΄λž˜μŠ€
    public class ParentClass{
        String parent = "I am parent Class";

        public void Parent(){
            System.out.println("I am ParentClass.Parent()");
        }
    }

    // μžμ‹ν΄λž˜μŠ€
    public class ChildClass extends ParentClass{
        String child = "I am child Class";

        public void Child(){
            Parent();
            System.out.println(parent);
            System.out.println("I am ChildClass.Child()");
            System.out.println(child);
        }
    }

    // μ‹€ν–‰λ©”μ†Œλ“œ
    public static void main(String[] args) {
        Inheritance inheritance = new Inheritance();
        ChildClass child = inheritance.new ChildClass();
        child.Child();
    }

}

 

μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

I am ParentClass.Parent()
I am parent Class
I am ChildClass.Child()
I am child Class

 

1) Parent() λ©”μ†Œλ“œ μ‹€ν–‰ - λΆ€λͺ¨ν΄λž˜μŠ€μΈ PrentClass의 Prent()λ₯Ό 호좜

2) parnet λ³€μˆ˜ μ‹€ν–‰ - λΆ€λͺ¨ν΄λž˜μŠ€μΈ PrentClass의 λ³€μˆ˜μΈ parnetλ₯Ό 호좜

3)ChildClass의 메세지듀을 좜λ ₯

 

μœ„μ˜ μ½”λ“œμ²˜λŸΌ ChildClassλΌλŠ” 객체λ₯Ό λ§Œλ“€μ—ˆλŠ”λ° ParentClass에 μ„ μ–Έλœ λ©”μ†Œλ“œμ™€ λ³€μˆ˜κ°€ 좜λ ₯λ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. μœ„μ²˜λŸΌ 상속을 톡해 μžμ‹ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ν΄λž˜μŠ€μ— μžˆλŠ” λ©”μ†Œλ“œ 및 λ³€μˆ˜μ˜ 속성을 λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

λŒ“κΈ€