chapter 10. 상속

κΉ€ν˜„μš°Β·2024λ…„ 5μ›” 5일
0

java

λͺ©λ‘ 보기
10/12
post-thumbnail

πŸ’» 상속?

ν΄λž˜μŠ€μ—λŠ” μƒμ†μ΄λΌλŠ” κΈ°λŠ₯이 μ‘΄μž¬ν•œλ‹€.

이전에 μ‘΄μž¬ν•˜λ˜ 클래슀λ₯Ό ν† λŒ€λ‘œ μƒˆλ‘œμš΄ 클래슀λ₯Ό λ§Œλ“€μ–΄ λ‚΄λŠ”κ²ƒμ΄λ‹€.
μ΄λ•Œ public,protectedλŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ 접근이 κ°€λŠ₯ν•˜λ©°
default의 κ²½μš°μ—λŠ” 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ μžμ‹ ν΄λž˜μŠ€κ°€ μ ‘κ·Όκ°€λŠ₯ν•˜λ‹€.

πŸ“– μ‚¬μš©λ²•

class μžμ‹ 클래슀 이름 extends λΆ€λͺ¨ ν΄λž˜μŠ€μ΄λ¦„{
}

으둜 μƒμ†ν• μˆ˜ μžˆλ‹€.

πŸ“– νŠΉμ§•

μš°λ¦¬κ°€ λΆ€λͺ¨λ‹˜μœΌλ‘œ λΆ€ν„° μœ μ „μ μœΌλ‘œ 물렀받듯이 클래슀 상속 λ˜ν•œ λ˜‘κ°™λ‹€.
λ‚΄λΆ€ λ§€μ†Œλ“œ,λ³€μˆ˜λ“€μ„ λ¬Όλ €λ°›μœΌλ©° μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 μš”μ†Œλ“€ + μžμ‹ λ§Œμ˜ 무언가λ₯Ό μΆ”κ°€ν• μˆ˜ μžˆλ‹€.

예λ₯Ό λ“€μ–΄ μžλ™μ°¨λΌλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€.
μžμ‹ ν΄λž˜μŠ€λŠ” 페라리라고 ν•΄λ³΄μž.

κ·Έλ ‡λ‹€λ©΄ νŽ˜λΌλ¦¬λŠ” λΆ€λͺ¨ 클래슀인 μžλ™μ°¨μ˜ μš”μ†Œλ“€ + 페라리만의 νŠΉμ§•μ„ μΆ”κ°€ ν• μˆ˜ μžˆλŠ”κ²ƒμ΄λ‹€.

λ˜ν•œ μžμ‹ν΄λž˜μŠ€μ˜ μžμ‹λ„ κ°€λŠ₯ν•˜λ‹€.
이러면 페라리 μ‚¬μ˜ λ‹€λ₯Έ λͺ¨λΈλ“€μ€ νŽ˜λΌλ¦¬λΌλŠ” 클래슀둜 λΆ€ν„° 상속을 λ°›μ•„ λ§Œλ“€μˆ˜ μžˆλ‹€.

이럴 경우 μž₯점은 νŽ˜λΌλ¦¬μ‚¬μ˜ 곡톡적인 변경이 λ°œμƒμ‹œμ— λͺ¨λ“  κΈ°μ’… 클래슀λ₯Ό λ°”κΏ€ ν•„μš”κ°€ 없이
νŽ˜λΌλ¦¬λΌλŠ” λΆ€λͺ¨ 클래슀만 μˆ˜μ • μ‹œμΌœ μ£Όλ©΄ λœλ‹€.

πŸ“– μ˜ˆμ‹œ

ν•œλ²ˆ μ‚¬μš©ν•΄λ³΄μž


public class Parent {
    public Parent(){
        System.out.println("Parent Constructor");
    }

    public void printName(){
        System.out.println("Parent printName()");
    }
}//λΆ€λͺ¨ 클래슀

public class Child extends Parent {
    public Child(){
        System.out.println("Child Constructor");
    }
}//μžμ‹ 클래슀

public class InhritancePrint {
    public static void main(String[] args) {
        Child child=new Child();
        child.printName();
    }
}// μ‹€μ‚¬μš©

을 ν•΄λ³΄μž κ²°κ³Όκ°€ μ–΄λ–»κ²Œ λ‚˜μ˜¬κΉŒ??

λ‚΄ μƒκ°μœΌλ‘œλŠ” child의 μƒμ„±μž μ‹€ν–‰ν›„ λ°”λ‘œ printName이 싀행될것같닀.

μ˜ˆμƒκ³ΌλŠ” λ‹€λ₯΄κ²Œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλΆ€ν„° 싀행이 λ˜μ—ˆλ‹€.
κ·Έλ ‡λ‹€λ©΄ μžμ‹μ˜ μžμ‹ 클래슀λ₯Ό λ§Œλ“€κ³  싀행해도 λΆ€λͺ¨μ™€ μ‘°λΆ€λͺ¨ 클래슀의 μƒμ„±μžκ°€ μ‹€ν–‰λ κΉŒ??
public class grandchild extends Child {
    public grandchild(){
        System.out.println("grandchild Constructor");
    }
}//μ†μž 클래슀


public class InhritancePrint {
    public static void main(String[] args) {
        // Child child=new Child();
        // child.printName();

        grandchild gchild=new grandchild();
        gchild.printName();
    }
}//μ†μž 클래슀 μ‹€ν–‰
μœ„ μ½”λ“œλ₯Ό μΆ”κ°€ν•œν›„ λ‹€μ‹œ μ‹€ν–‰ν•΄λ³΄μž

μ‘°λΆ€λͺ¨ 클래슀의 μƒμ„±μž λ§ˆμ € 싀행이 λ˜μ—ˆλ‹€.

λ‚΄λΆ€μ μœΌλ‘œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžλΆ€ν„° μ‹€ν–‰λœν›„ μžμ‹ 클래슀의 μƒμ„±μžκ°€ μ‹€ν–‰λœλ‹€.

πŸ“– 상속과 κΈ°λ³Έ μƒμ„±μž

μœ„μ˜ λΆ€λͺ¨ν΄λž˜μŠ€λ“€μ—μ„œ κΈ°λ³Έμƒμ„±μžλ₯Ό λ§Œλ“€μ–΄ λ†“μœΌλ©΄
μžμ‹ ν΄λž˜μŠ€μ—κ²Œ μƒμ†μ‹œ λ¨Όμ € λΆ€λͺ¨μ˜ μƒμ„±μžκ°€ μ‹€ν–‰ν›„ μžμ‹μ΄ λ§Œλ“€μ–΄μ‘Œλ‹€.

κ·Έλ ‡λ‹€λ©΄ λ§Œμ•½μ— λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έ μƒμ„±μžκ°€ μ—†λ‹€λ©΄ μ–΄λ–»κ²Œ 될까???
μœ„μ˜ μ½”λ“œμ—μ„œ parent의 μƒμ„±μžλ₯Ό 

public class Parent {
    public Parent(String Str){
        System.out.println("Parent Constructor");
    }

    public void printName(){
        System.out.println("Parent printName()");
    }
}
μ΄λ ‡κ²Œ λ³€κ²½ν›„ λ‹€μ‹œ μ‹€ν–‰ν•΄λ³΄μž.

κΈ°λ³Έμƒμ„±μžκ°€ μ—†μ–΄μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€κ³  μ•Œλ €μ€€λ‹€.

이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ”
1. κΈ°λ³Έμƒμ„±μž λ§Œλ“€μ–΄μ£ΌκΈ°
2. super() μ‚¬μš©

이쀑 super μ‚¬μš©μ„ μ•Œμ•„λ³΄μž.

πŸ“– super

superλŠ” ν΄λž˜μŠ€μ—μ„œ this와 λΉ„μŠ·ν•œ μ—­ν• μ„ν•œλ‹€.
μ΄λ•Œ thisλŠ” μžμ‹ μ˜ 객체λ₯Ό λ‚˜νƒ€λ‚Έλ‹€λ©΄
super은 λΆ€λͺ¨ 클래슀λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

μœ„ 처럼 μƒμ„±μžκ°€ λ§€κ°œλ³€μˆ˜λ₯Ό λ°›λŠ” 것 밖에 μ—†λ‹€λ©΄

μš°λ¦¬λŠ” super("λ§€κ°œλ³€μˆ˜ 전달");을 μžμ‹ ν΄λž˜μŠ€μ— 써쀌으둜 문제λ₯Ό ν•΄κ²°κ°€λŠ₯ν•˜λ‹€.
μ΄λ•Œ superλŠ” λ°˜λ“œμ‹œ μžμ‹ 클래슀의 μƒμ„±μžμ˜ 제일 첫번째 쀄에 μ‚¬μš©ν•΄μ•Όν•œλ‹€.

public class Child extends Parent {
    public Child(){
        super("hi");
        System.out.println("Child Constructor");
    }
}
μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ©°

μ΄λ•Œ μ†μž 클래슀의 μƒμ„±μžμ—κ²Œ super("hi")λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.
μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©μ„ ν•΄μ•Ό λ¬Έμ œκ°€ 생기지 μ•ŠλŠ”λ‹€.

λΆ€λͺ¨->μžμ‹->μ†μž 순으둜 λ‚΄λ €μ˜€κΈ° λ•Œλ¬Έμ— λ°”λ‘œ μœ„μ˜ 클래슀λ₯Ό κΈ°μ€€μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

πŸ“– λ§€μ†Œλ“œ overriding

μžμ‹μ€ λΆ€λͺ¨μ˜ λ§€μ†Œλ“œλ₯Ό λͺ¨λ‘ ν¬ν•¨ν•œλ‹€.(private λ“±μ˜ 경우λ₯Ό μ œμ™Έν•˜λ©΄)
μ΄λ•Œ λ‚΄κ°€ λΆ€λͺ¨λ‘œ λΆ€ν„° 받은 λ§€μ†Œλ“œλ₯Ό 살짝 변경이 κ°€λŠ₯ν•˜λ‹€.

μ•žμ„œ 배운 overloading은 같은 이름 λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜μ˜ λ§€μ†Œλ“œλ₯Ό μ—¬λŸ¬κ°œ 생성이 κ°€λŠ₯ν•œ κΈ°λŠ₯μ΄μ˜€λ‹€.
overriding λ˜ν•œ λΉ„μŠ·ν•˜λ‹€.

overriding은 같은 이름 같은 λ§€κ°œλ³€μˆ˜ λ‹€λ₯Έ λ‚΄μš©μ˜ λ§€μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€κ°€ κ°€μ§ˆμˆ˜ μžˆλ‹€λŠ” 것이닀.
이떄 μ€‘μš”ν•œ κ·œμΉ™μ΄ μžˆλ‹€.

1. λΆ€λͺ¨μ˜ λ§€μ†Œλ“œμ™€ 이름 리턴 λ§€κ°œλ³€μˆ˜κ°€ λ™μΌν•΄μ•Όν•˜λ‹€.
2. λ§Œμ•½ 이름이 같은데 리턴, λ§€κ°œλ³€μˆ˜ λ‘˜μ€‘ν•˜λ‚˜κ°€ λ‹€λ₯΄λ‹€λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
3. λΆ€λͺ¨μ˜ μ ‘κ·Ό μ œμ–΄μž 보닀 쒁은 λ²”μœ„λ‘œ 가지 λͺ»ν•œλ‹€.(λΆ€λͺ¨ : public μžμ‹ : private μ•ˆλŒ)

μ΄λ•Œ μ†μžλŠ” μ–΄λ–»κ²Œ 될까????
μ‘°λΆ€λͺ¨(parent)의 λ§€μ†Œλ“œμΈ printName을 λ³€κ²½ν›„ μ†μž 클래슀λ₯Ό 싀행해보면
μ–΄λ–»κ²Œ 될까?

μ†μžλŠ” λΆ€λͺ¨(child)둜 λΆ€ν„° μƒμ†λ˜μ—ˆκΈ°μ— λΆ€λͺ¨μ˜ λ§€μ†Œλ“œλ₯Ό κ·ΈλŒ€λ‘œ λ”°λΌμ˜¨λ‹€.

μœ„μ—μ„œλŠ” μ‚¬μš©μ•ˆν–ˆμ§€λ§Œ toString 처럼 μ˜€λ²„λΌμ΄λ“œλ₯Ό ν• λ•ŒλŠ”
@overrideλ₯Ό μœ„μ— λͺ…μ‹œν•΄μ£Όκ³  ν•˜λŠ”κ²ƒμ΄ μ’‹λ‹€.

πŸ“– casting

ν΄λž˜μŠ€λ„ ν˜•λ³€ν™˜μ΄ μ‘΄μž¬ν•œλ‹€.

λΆ€λͺ¨λ₯Ό μžμ‹ 클래슀둜 λ˜λŠ” μžμ‹μ„ λΆ€λͺ¨ 클래슀둜 변경이 κ°€λŠ₯ν•œλ°

Parent Obj1 = new Child();
꼴둜 μžμ‹μ΄ λΆ€λͺ¨λ‘œ λ³€ν•˜λŠ” 것을 up-casting

Child Obj2 = new Parent();
꼴둜 λΆ€λͺ¨κ°€ μžμ‹μœΌλ‘œ ν˜•λ³€ν™˜μ‹œν‚€λŠ” 것을 down-castingμ΄λΌν•œλ‹€.

ν•˜μ§€λ§Œ μ΄λ•Œ down-casting을 μ €λŸ°μ‹μœΌλ‘œ ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
μ™œ 그럴까?

πŸ“– 였λ₯˜

λΆ€λͺ¨-μžμ‹μœΌλ‘œ μƒκ°ν•˜μ§€ 말고 더 κ°„λ‹¨ν•˜κ²Œ λ°”κΏ”λ³΄μž

동물-ν† λΌμ˜ 관계라 ν•΄λ³΄μž

Animal animal = new Rabbit(); // ν† λΌλŠ” 동물이닀. (Upcasting)
Rabbit rabbit = new Animal(); // ν•˜μ§€λ§Œ 동물은 토끼가 μ•„λ‹μˆ˜λ„ μžˆλ‹€.(down casting)

μžμ‹μ˜ 경우 λΆ€λͺ¨λ³΄λ‹€ 더 λ§Žμ€ λ§€μ†Œλ“œμ™€ 속성등을 가지고 μžˆμ„μˆ˜ μžˆκΈ°μ—
였λ₯˜κ°€ λ°œμƒν•œλ‹€.


down-casting을 그러면 μ–΄λ–»κ²Œ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ”κ°€??
μš°λ¦¬λŠ” down-casting을 λͺ…μ‹œμ μœΌλ‘œ ν™•μΈμ‹œμΌœ μ€˜μ•Όν•œλ‹€.
μ»΄νŒŒμΌλŸ¬μ—κ²Œ 이거 μ‹€μˆ˜ μ•„λ‹ˆκ³  μΌλΆ€λŸ¬ λ°”κΎΈλ €λŠ”κ±°μ•Ό 라고 μ•Œλ €μ£ΌκΈ° μœ„ν•΄μ„œ

 Rabbit rabbit = (Rabbit) animal; // Downcasting 
 (Rabbit)을 ν†΅ν•΄μ„œ λͺ…μ‹œμ μœΌλ‘œ ν˜•λ³€ν™˜ ν•΄μ€˜μ•Όν•œλ‹€.

πŸ“– ꢁ금증

κ·Έλ ‡λ‹€λ©΄ up-casting이 κ°€λŠ₯ν•œ μ΄μœ λŠ”
μžμ‹ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 μš”μ†Œλ“€μ„ 가지고 있기 λ•Œλ¬Έμ΄ μ•„λ‹Œκ°€???
λ§Œμ•½μ— μ˜€λ²„λΌμ΄λ”©μœΌλ‘œ λ§€μ†Œλ“œλ₯Ό ν•˜λ‚˜ λ°”κΏ¨μ„λ•Œλ„ 그게 λ˜λ‚˜?

λ˜ν•œ λœλ‹€λ©΄ μ—… μΊμŠ€νŒ…ν•œ parent의 λ§€μ†Œλ“œλ₯Ό μ‹€ν–‰μ‹œ κ²°κ³Όκ°€ μ–΄μ°Œλ˜λ‚˜?
public class tempt {
    public static void main(String[] args) {
        castingParent CTP=new castingChild();//child 클래슀λ₯Ό parent 클래슀둜 ν˜•λ³€ν™˜ 였λ₯˜x
        //castingChild PTC=new castingParent();//parentλ₯Ό child둜 ν˜•λ³€ν™˜ -> 였λ₯˜
        //castingChild PTC=(castingChild)(CTP);//λͺ…μ‹œμ μΈ ν˜•λ³€ν™˜μ‹œ κ°€λŠ₯은함

        // μ΄λ•Œ μžμ‹μ€ λΆ€λͺ¨κ°€ 가진 λ§€μ†Œλ“œμ™€ λ³€μˆ˜λ“€μ„ λͺ¨λ‘ 가지고 μžˆκΈ°μ— κ°€λŠ₯
        // κ·Έλ ‡λ‹€λ©΄ overrideλ₯Ό ν•œμƒνƒœμ—¬λ„ κ°€λŠ₯ν•˜λƒ???

        CTP.printName();
        CTP.printUpcasting();
    }
}

public class castingParent{
    public void printName(){
        System.out.println("I'm your parent!");
    }

}//parent λ§€μ†Œλ“œ
public class castingChild extends castingParent{
    
    @Override
    public void printName(){
        System.out.println("I'm your child");
    }

    public void printUpcasting(){
        System.out.println("μ—…μΊμŠ€νŒ… ν–ˆμ§€λ‘±!");
    }
}//child λ§€μ†Œλ“œ

κ²°κ³Όκ°€ κ³Όμ—° μ–΄λ–»κ²Œ λ‚˜μ˜¬κΉŒ???

문제 없이 싀행이 λ˜μ—ˆμœΌλ©°
λ˜ν•œ child의 λ§€μ†Œλ“œλ‘œ μ‹€ν–‰λ˜μ—ˆλ‹€.

FAQ

ꢁ금증이 해결이 μ•ˆλ˜μ„œ μˆ™μ œλ‘œ 남겨둔닀.

1. μ—… μΊμŠ€νŒ…μ΄ κ·Έλƒ₯ κ°€λŠ₯ν•œ μ΄μœ λŠ” μžμ‹μ΄ λΆ€λͺ¨μ˜ 속성을 가지고 있기 λ•Œλ¬Έ μ•„λ‹Œκ°€?
   κ·Έλ ‡λ‹€λ©΄ μ–΄μ§Έμ„œ overrideλ₯Ό ν•˜λ©΄ 속성이 λ‹¬λΌμ§€λŠ” 것 같은데 λ¬Έμ œμ—†μ΄ upcasting이 λ˜λŠ”κ°€
   
2. upcasting μ‹œμ—λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨λ‘œ ν˜•μ΄ 바뀐닀. 
   그런데 μ–΄μ§Έμ„œ λ‚΄λΆ€ λ§€μ†Œλ“œλ₯Ό 싀행해보면 μžμ‹ λ§€μ†Œλ“œλ‘œ 싀행이 λ˜λŠ”κ°€?(overrideν•œ λ§€μ†Œλ“œ)
   
3. μ˜€λ²„λΌμ΄λ“œν•œ μžμ‹μ˜ λ§€μ†Œλ“œκ°€ μ‹€ν–‰λ˜μ—ˆλŠ”λ° κ·Έλƒ₯ μžμ‹μ˜ λ§€μ†Œλ“œλŠ” 싀행이 λ˜μ§€ μ•Šκ³  였λ₯˜κ°€ λ°œμƒν•œλ‹€.
 μ™œ 이런 차이가 λ°œμƒν•˜λŠ” 것인가???
profile
학생

0개의 λŒ“κΈ€