상속

2023. 1. 31. 17:11ㆍjava

상속 문법 : 클래슀λͺ… extends 상속 받을 클래슀λͺ…

class BusinessMan extends Man{

}

상속 받은 ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ λ³€μˆ˜ 및 λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ²Œ λœλ‹€.

public class Man {
    String name;

    public void tellName(){
        System.out.println("이름은 " + name);
    }
}
//상속 문법 : 클래슀λͺ… extends 상속 받을 클래슀λͺ…
class BusinessMan extends Man{

}

BusinessMan ν΄λž˜μŠ€μ— λ©”μ†Œλ“œκ°€ ν•˜λ‚˜λ„ μ—†μ§€λ§Œ μ•„λž˜μ²˜λŸΌ Man의 λ©”μ†Œλ“œ μ‚¬μš© κ°€λŠ₯

public class ManTest {
    public static void main(String[] args) {
        BusinessMan m1 = new BusinessMan();
        System.out.println(m1.name);
        m1.tellName();

    }
}

 * Manκ³Ό BusinessMan의 관계λ₯Ό μ•„λž˜μ™€ 같이 μ •μ˜ν•¨. 

 

     Man          BusinessMan

λΆ€λͺ¨ν΄λž˜μŠ€     μžμ‹ν΄λž˜μŠ€

수퍼클래슀     μ„œλΈŒν΄λž˜μŠ€

μƒμœ„ν΄λž˜μŠ€     ν•˜μœ„ν΄λž˜μŠ€

 

class BusinessMan extends Man{
    String company;

    public void tellInfo(){
        System.out.println("제 직μž₯은 " + company);

    }

}
BusinessMan은 본인이 κ°€μ§„ λ©”μ†Œλ“œ+λ³€μˆ˜+Man이 κ°€μ§„ λ©”μ†Œλ“œ+λ³€μˆ˜ λ‹€ μ‚¬μš© κ°€λŠ₯ ν•œ 것!
 
λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ κ°€μ§„ λ³€μˆ˜λͺ…을 μžμ‹ ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžλ‘œ μ΄ˆκΈ°ν™” κ°€λŠ₯ν•˜λ‚˜
μ›λž˜ 자리인 λΆ€λͺ¨ ν΄λž˜μ„œμ—μ„œ ν•˜λŠ” 것이 μ’‹λ‹€.
public class Man {
    String name;

    public Man(){
        this.name = "";
    }

    public void tellName(){
        System.out.println("이름은 " + name);
    }

}
//상속 문법 : 클래슀λͺ… extends 상속 받을 클래슀λͺ…
//  Man       BusinessMan
//λΆ€λͺ¨ν΄λž˜μŠ€     μžμ‹ν΄λž˜μŠ€
//수퍼클래슀     μ„œλΈŒν΄λž˜μŠ€
//μƒμœ„ν΄λž˜μŠ€     ν•˜μœ„ν΄λž˜μŠ€
class BusinessMan extends Man{
    String company;

    public BusinessMan(){
        this.company = " ";
        name = "";  //λΆ€λͺ¨ 클래슀의 name λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™” ν•  μˆ˜λŠ” μžˆμœΌλ‚˜, μΆ”μ²œX
    }

    public void tellInfo(){
        System.out.println("제 직μž₯은 " + company);
    }
}

상속관계 즉 μžμ‹ν΄λž˜μ„œμ—μ„œ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ μƒμ„±μžμ˜ κ°€μž₯ μ²«μΆœμ— μˆ¨μ–΄ μžˆλŠ” super();κ°€ μ‹€ν–‰λœλ‹€.

super()λŠ” λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό 호좜.

κ·Έ 후에 ν•΄λ‹Ή 클래슀의 μƒμ„±μžλ₯Ό μ‹€ν–‰

public class Man {
    String name;

    public Man(){
        System.out.println("Man μƒμ„±μž 호좜");
    }
    public void tellName(){
        System.out.println("이름은 " + name);
    }
}
//상속 문법 : 클래슀λͺ… extends 상속 받을 클래슀λͺ…
class BusinessMan extends Man{
    String company;

    public BusinessMan(){
        System.out.println("BusinessMan μƒμ„±μž 호좜");
        this.company = " ";
    }
    public void tellInfo(){
        System.out.println("제 직μž₯은 " + company);
    }
}

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œμ˜ μƒμ„±μž λ¨Όμ € 호좜된 것을 확인할 수 μžˆλ‹€. 

>> μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 μƒμ„±μž μ΄ˆκΈ°ν™”λ₯Ό ν•  ν•„μš” μ—†μŒ.

public BusinessMan(){
    super(); //λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μž 호좜 λͺ…λ Ήμ–΄.
    System.out.println("BusinessMan μƒμ„±μž 호좜");
    this.company = " ";
}

μžμ‹ν΄λž˜μŠ€ μƒμ„±μžμ—λŠ” 맨 μœ„μ— super(); << μˆ¨μ–΄ 있음

super(); λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μž 호좜

**  this(): ν•΄λ‹Ή 클래슀의 κΈ°λ³Έ μƒμ„±μž 호좜

 

λΆ€λͺ¨ ν΄λž˜μŠ€μ— κΈ°λ³Έ μƒμ„±μžκ°€ μ—†λ‹€λ©΄ μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” 무쑰건 κΈ°λ³Έ μƒμ„±μžλ‘œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ 남.

이런 였λ₯˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ”

1. λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œμ˜ μƒμ„±μžλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ λ§Œλ“€κ³  μ‹ΆμœΌλ©΄ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ •μ˜

2. super()의 λ§€κ°œλ³€μˆ˜ 정보λ₯Ό λΆ€λͺ¨ν΄λž˜μŠ€μ˜ μƒμ„±μž λ§€κ°œλ³€μˆ˜ 정보와 λ™μΌν•˜κ²Œ 호좜.

 

μ˜ˆμ‹œ1

public class SuperCls {
    public SuperCls(){
        System.out.println("μƒμ„±μž1");
    }
    public SuperCls(int i){
        System.out.println("μƒμ„±μž2");
    }
    public SuperCls(int i, int j){
        System.out.println("μƒμ„±μž3");
    }
}
public class SubCls extends SuperCls {

    public SubCls(){
        System.out.println("μ„œλΈŒ μƒμ„±μž1");
    }
}

슈퍼 μƒμ„±μžμ˜ κΈ°λ³Έ μƒμ„±μžλ„ 같이 좜λ ₯λ˜λŠ” 것을 확인할 수 있음.

public SubCls(int a) {
    super(5,3); //λ§€κ°œλ³€μˆ˜λ‘œ μ •μˆ˜λ₯Ό 쀌.
    System.out.println("μ„œλΈŒ μƒμ„±μž2");
}

μƒλž΅λœ 슈퍼λ₯Ό 적고 λ§€κ°œλ³€μˆ˜λ‘œ μ •μˆ˜λ₯Ό μ£Όλ©΄ 

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ κΈ°λ³Έμƒμ„±μžκ°€ μ•„λ‹Œ 두 μ •μˆ˜λ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ κ°–λŠ” μƒμ„±μžκ°€ 싀행됨

 

 

μžλ°”λŠ” μ•„λž˜μ²˜λŸΌ 닀쀑 상속을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€!

λ¬Έλ²•μ μœΌλ‘œ μ•ˆλ˜μ§€λ§Œ, μ•„λž˜μ²˜λŸΌ 닀쀑 상속을 ν•œ κ²ƒμ²˜λŸΌ 클래슀λ₯Ό κ΅¬ν˜„ν•  μˆ˜λŠ” μžˆλ‹€.

public class Aaa {
    int a;
}
class Bbb extends Aaa{
    int b;
}

class Ccc extends Bbb{
    public void ccc(){
        a = 10;
        b = 20;
    }

}

private둜 μ„ μ–Έλœ λ³€μˆ˜ 및 λ©”μ†Œλ“œλŠ” 상속을 받더라도 μ‚¬μš© λΆˆκ°€. >> 상속은 λ˜μ§€λ§Œ 직접 μ‚¬μš©μ΄ μ•ˆλ˜λŠ” 것.

상속이 μ΄λ£¨μ–΄μ‘Œμ„ λ•Œ μƒμ†λœ λ³€μˆ˜(λ©”μ†Œλ“œ)와 κ°€μ§€κ³  μžˆλŠ” λ³€μˆ˜(λ©”μ†Œλ“œ)의 λͺ…이 κ°™μœΌλ©΄ λ‘˜ λ‹€ κ°€μ§„λ‹€.

μžλ°”λŠ” λ‘˜μ„ ꡬ뢄함. > 상속받은 λ³€μˆ˜(λ©”μ†Œλ“œ)에 직접 접근을 λͺ» ν•  뿐

좜λ ₯ 받을 λ•Œ 그럼 ꡬ뢄 μ–΄λ–»κ²Œ? (μ‹€λ¬΄μ—μ„œλŠ” μ΄λ ‡κ²Œ  ν—·κ°ˆλ¦¬κ²Œ μ‚¬μš© μ•ˆ 함)

예)sout(x) >> μžμ‹ μ΄ κ°€μ§„ λ³€μˆ˜(λ©”μ†Œλ“œ)λ₯Ό 말함

this.x > μœ„μ™€ κ°™λ‹€.

super.x > 상속받은 λ³€μˆ˜(λ©”μ†Œλ“œ)λ₯Ό 말함

 

public class Aaa {
    int a;
    private int aaa;
}
class Bbb extends Aaa{
    int b;
    public void bbb(){
        a = 10;
        aaa = 20;  //였λ₯˜
    }
}
protected : private + μƒμ†ν•œ μžμ‹κΉŒμ§€ μ‚¬μš© ν—ˆμš©
public class Aaa {
    int a;
    private int aaa;
    protected int a1;
    //protected : private + μƒμ†ν•œ μžμ‹κΉŒμ§€ μ‚¬μš© ν—ˆμš©
}
class Bbb extends Aaa{
    int b;
    public void bbb(){
        a = 10;
        a1 = 10;
        //aaa = 20; 였λ₯˜
    }
}

*****정리

상속 :  클래슀λ₯Ό μ„ μ–Έν•  λ•Œ λ‹€λ₯Έ 클래슀λ₯Ό 상속 λ°›μœΌλ©΄ 상속 받은 클래슀의 λ³€μˆ˜μ™€ λ©”μ†Œλ“œλ₯Ό λ‚΄κ²ƒμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.

public class A extends B { }

- λ¬Έλ²•μ μœΌλ‘œ 닀쀑상속이 λΆˆκ°€.

- 상속 κ΄€κ³„μ—μ„œ μžμ‹/μ„œλΈŒ/ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμ„±μž 호좜 유의!!

μžμ‹ 클래슀의 μƒμ„±μž κ°€μž₯ 첫 μ€„μ—λŠ” super(); ν‚€μ›Œλ“œκ°€ μˆ¨μ–΄ μžˆλ‹€.