Covenant

πŸ“˜ λͺ…μ €λ‘œ λ‹€μ‹œλ³΄λŠ” μžλ°”μ™€ λ©”λͺ¨λ¦¬ 이야기 2편



λ„μž…

  λͺ…μ €λ‘œ λ‹€μ‹œλ³΄λŠ” μžλ°”μ™€ λ©”λͺ¨λ¦¬ 1νŽΈμ—μ„œ μž‘μ„±ν•œ 것과 같이 쒋은 μ‹€λ ₯을 κ°–μΆ˜ κ°œλ°œμžκ°€ 되기 μœ„ν•΄μ„œ λ‹¨μˆœνžˆ 자기의 μ½”λ“œκ°€ λŒμ•„κ°”λ‹€ 뿐 μ•„λ‹ˆλΌ μžμ‹ μ˜ μ½”λ“œκ°€ 컴퓨터 λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό 이해해야 ν•©λ‹ˆλ‹€. 1νŽΈμ—μ„œλŠ” main(), λ³€μˆ˜, block, static λ³€μˆ˜, λ©€ν‹° ν”„λ‘œμ„ΈμŠ€, λ©€ν‹° μ“°λ ˆλ“œλ₯Ό μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ•Œκ³  μžˆλŠ” μ–Έμ–΄μ˜ λ™μž‘κ³Ό λΉ„μŠ·ν•΄μ„œ μ–΄λ ΅μ§€ μ•Šμ•˜μ„ κ²ƒμž…λ‹ˆλ‹€. λ³Έ κΈ€μ—μ„œλŠ” 좔상화, 상속, λ‹€ν˜•μ„± μ½”λ“œμ— λŒ€ν•΄μ„œ T λ©”λͺ¨λ¦¬μ— μ–΄λ–»κ²Œ μ €μž₯λ˜λŠ”μ§€ λ³Ό κ²ƒμž…λ‹ˆλ‹€.


좔상화와 T λ©”λͺ¨λ¦¬

public class Mouse {
    public String name;
    public void sing() { }
}

[Mouse.java]


public class Mouse {
    public static void main(String [] args){
        Mouse mickey = new Mouse();
        mickey.name = "λ―Έν‚€";
        mickey = null;
    }
}

[MouseDriver.java]

  • MouseDriver.java의 public static void main(String [] args) κ°€ μ‹€ν–‰λ˜κΈ° μ „ T λ©”λͺ¨λ¦¬ μŠ€λƒ…μƒ·μ€ μœ„μ˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
  • java.lang νŒ¨ν‚€μ§€μ™€ ν΄λž˜μŠ€λ“€μ΄ T λ©”λͺ¨λ¦¬μ˜ μŠ€νƒœν‹± μ˜μ—­μ— λ°°μΉ˜λ©λ‹ˆλ‹€.
  • μžμ„Ένžˆ 보면 nameμ—λŠ” λ³€μˆ˜ μ €μž₯ 곡간이 보이지 μ•Šκ³  μ΄λ¦„λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • 객체가 μƒμ„±λ˜μ–΄μ•Όλ§Œ μ†μ„±μ˜ 값을 μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간이 μŠ€νƒœν‹± μ˜μ—­μ΄ μ•„λ‹Œ νž™ μ˜μ—­μ— ν• λ‹Ήλ©λ‹ˆλ‹€.

  • 객체 λ³€μˆ˜ mickeyκ°€ Mouse 객체에 λŒ€ν•œ μ°Έμ‘° λ³€μˆ˜μž…λ‹ˆλ‹€.
  • 객체 λ³€μˆ˜ mickeyκ°€ Mouse 객체의 μ£Όμ†Œ(포인터)λ₯Ό κ°€μ§€κ³  μžˆλ‹€λŠ” 것을 ν™”μ‚΄ν‘œλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.

  • mickey = null이 μ‹€ν–‰λ˜λ©΄ 객체 μ°Έμ‘° λ³€μˆ˜ mickeyκ°€ 더 이상 νž™ μ˜μ—­μ— μ‘΄μž¬ν•˜λŠ” Mouse 객체λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • κ°€λΉ„μ§€ 컬렉터가 아무도 μ°Έμ‘°ν•΄ μ£Όμ§€ μ•ŠλŠ” Mouse 객체λ₯Ό μ“°λ ˆκΈ°λ‘œ μΈμ§€ν•˜κ³  μˆ˜κ±°ν•΄ κ°‘λ‹ˆλ‹€.
  • κ°€λΉ„μ§€ μ»¬λž™ν„°κ°€ λ‹€λ…€κ°„ T λ©”λͺ¨λ¦¬ μƒνƒœλŠ” μœ„μ˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

상속과 T λ©”λͺ¨λ¦¬

public class Animal {
    public String name;

    public void showName(){
        System.out.println("μ•ˆλ…• λ‚˜λŠ” %sμ•Ό.", name );
    }
}

[Animal.java]

public class Penguin extends Animal {
    public String habitat;

    public void showHabitat(){
        System.out.printf("%sλŠ” $s에 μ‚΄μ•„", name, habitat);
    }
}

[Penguin.java]


public class Driver {
    public static void main(String [] args){
        Penguin pororo = new Penguin();

        pororo.name = "λ½€λ‘œλ‘œ";
        poeoeo.habitat = "남극";

        pororo.showName();
        pororo.showHabitat();

        Animal pingu = new Penguin();
        pingu.name = "핑ꡬ";
        //pingu.habitat = "EBS";

        pingu.showName();
        //pingu.showHabitat();
    }
}

[Driver.java]

  • Penguin 클래슀의 μΈμŠ€ν„΄μŠ€λ§Œ νž™ μ˜μ—­μ— μƒκΈ°λŠ” 것이 μ•„λ‹ˆλΌ Animal 클래슀의 μΈμŠ€ν„΄μŠ€λ„ ν•¨κ»˜ νž™ μ˜μ—­μ— μƒκΉλ‹ˆλ‹€.
  • κ·Έλ¦Όμ—μ„œλŠ” μƒλž΅λ˜μ—ˆμ§€λ§Œ λͺ¨λ“  클래슀의 μ΅œμƒμœ„ 클래슀인 Object 클래슀의 μΈμŠ€ν„΄μŠ€λ„ ν•¨κ»˜ μƒμ„±λ©λ‹ˆλ‹€.
  • pingu 객체 μ°Έμ‘° λ³€μˆ˜κ°€ 가리킀고 μžˆλŠ” 것은 Penguin μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ Animal μΈμŠ€ν„΄μŠ€μž…λ‹ˆλ‹€.
  • pingu 객체 μ°Έμ‘° λ³€μˆ˜λŠ” 사싀 νŽ­κ·„μ΄μ§€λ§Œ λ™λ¬Όμ΄λΌλŠ” κ²ƒλ§Œ μΈμ‹ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • λ”°λΌμ„œ pingu 객체 μ°Έμ‘° λ³€μˆ˜λŠ” habitat 속성과 showHabitat() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€ν˜•μ„±κ³Ό T λ©”λͺ¨λ¦¬

public class Animal {
    public String name;

    public void showName(){
        System.out.println("μ•ˆλ…• λ‚˜λŠ” %sμ•Ό.", name );
    }
}

[Animal.java]

public class Penguin extends Animal {
    public String habitat;

    public void showHabitat(){
        System.out.printf("%sλŠ” $s에 μ‚΄μ•„", name, habitat);
    }

    // μ˜€λ²„ 라이딩 - μž¬μ •μ˜: μƒμœ„ 클래슀의 λ©”μ„œλ“œμ™€ 같은 λ©”μ„œλ“œ 이름, 같은 인자 리슀트
    public void showName(){
        System.out.println("λ‚΄ 이름은 λΉ„λ°€μž…λ‹ˆλ‹€.");
    }

    // μ˜€λ²„λ‘œλ”© - μ€‘λ³΅μ •μ˜: 같은 λ©”μ„œλ“œ 이름, λ‹€λ₯Έ 인자 리슀트
    public void showName(String yourName){
        System.out.println("%s μ•ˆλ…•, λ‚˜λŠ” $s라고 ν•΄.", yourName, name);
    }
}

[Penguin.java]


public class Driver {
    public static void main(String [] args){
        Penguin pororo = new Penguin();

        pororo.name = "λ½€λ‘œλ‘œ";
        poeoeo.habitat = "남극";

        pororo.showName();
        pororo.showName("초보람보");
        pororo.showHabitat();

        Animal pingu = new Penguin();
        pingu.name = "핑ꡬ";
        pingu.showName();
    }
}

[Driver.java]

μ–΄λ¨Έ λ‚΄ 이름은 μ•Œμ•„μ„œ λ­ν•˜κ²Œμš”?
초보람보 μ•ˆλ…•, λ‚˜λŠ” λ½€λ‘œλ‘œλΌκ³  ν•΄
λ½€λ‘œλ‘œλŠ” 남극에 μ‚΄μ•„
μ–΄λ¨Έ 내이름은 μ•Œμ•„μ„œ λ­ν•˜κ²Œμš”?

[μ‹€ν–‰κ²°κ³Ό]

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

  • pororo.showName(); 뢀뢄을 μ‹€ν–‰ν•˜λ©΄ Animal 객체에 μžˆλŠ” showName() λ©”μ„œλ“œλŠ” Penguin 객체에 μžˆλŠ” showName() λ©”μ„œλ“œμ— μ˜ν•΄ μž¬μ •μ˜, 즉 κ°€λ €μ‘ŒκΈ°μ— Penguin κ°μ²΄μ—μ„œ μž¬μ •μ˜ν•œ showName() λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • T λ©”λͺ¨λ¦¬μ—μ„œ μ£Όμ˜ν•΄μ•Ό ν•  것은 pingu 객체 μ°Έμ‘° λ³€μˆ˜λŠ” νƒ€μž…μ΄ Animal νƒ€μž…μ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€.
  • Animal 객체의 showName()은 Penguin 객체의 showName()에 μ˜ν•΄ κ°€λ €μ Έ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 17번째 μ€„μ˜ pingu.showName() λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ Animal 객체에 μ •μ˜λœ showName() λ©”μ„œλ“œκ°€ μ•„λ‹Œ Penguin 객체에 μ˜ν•΄ μ •μ˜λœ showName() λ©”μ„œλ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
  • μƒμœ„ 클래슀 νƒ€μž…μ˜ 객체 μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©(μž¬μ •μ˜)ν•œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.