μƒμ†μ΄λž€

  • 객체지ν–₯μ–Έμ–΄μ˜ νŠΉμ„±μ΄μž μ†Œν”„νŠΈμ›¨μ–΄μ˜ μž¬μ‚¬μš©μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” κΈ°μˆ μ΄λ‹€.
  • μ‹€μƒν™œμ˜ 예λ₯Ό λ“€λ©΄ λΆ€λͺ¨ μœ μ „μžλ₯Ό μžμ‹μ΄ λ¬Όλ €λ°›λŠ” μœ μ „μ μΈ 상속과 μœ μ‚¬ν•˜λ‹€.
  • C++ μ–Έμ–΄μ—μ„œμ˜ μƒμ†μ˜ κ°œλ…κ³Ό μœ μ‚¬ν•˜λ‹€.
    • 차이점이라면 μžλ°”μ—μ„œμ˜ 상속은 닀쀑 상속(multiple inheritance)이 λΆˆκ°€λŠ₯ν•˜λ‹€.
  • μžλ°”μ—μ„œλŠ” 두 클래슀(class) μ‚¬μ΄μ—μ„œμ˜ λΆ€λͺ¨-μžμ‹μ˜ 상속 관계λ₯Ό μ„ μ–Έν•œλ‹€.
    • μ΄λ•Œ, λΆ€λͺ¨ 클래슀λ₯Ό 수퍼 클래슀(super class), μžμ‹ 클래슀λ₯Ό μ„œλΈŒ 클래슀(sub class)라고 ν•œλ‹€.
    • μ„œλΈŒ ν΄λž˜μŠ€λŠ” μžμ‹ μ˜ λ©€λ²„λΏλ§Œ μ•„λ‹ˆλΌ 수퍼 클래슀의 멀버λ₯Ό ν¬ν•¨ν•˜κ²Œ λœλ‹€.

κΈ°λ³Έ 클래슀? λΆ€λͺ¨ 클래슀?
상속 관계에 μžˆλŠ” 두 클래슀λ₯Ό λΆ€λ₯΄λŠ” 이름은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ§ˆλ‹€ μ‘°κΈˆμ”© λ‹€λ₯΄λ‹€. C++μ—μ„œλŠ” 상속을 ν•΄μ£ΌλŠ” 클래슀λ₯Ό κΈ°λ³Έ 클래슀(base class), 이와 λ°˜λŒ€λ‘œ 상속을 λ°›λŠ” 클래슀λ₯Ό νŒŒμƒ 클래슀(derived class)라고 λΆ€λ₯Έλ‹€. λ˜ν•œ C#μ—μ„œλŠ” 각각 λΆ€λͺ¨ 클래슀(parent class), μžμ‹ 클래슀(child class)라고 λΆ€λ₯Έλ‹€.


μƒμ†μ˜ μž₯점(advantange)

μ•„λž˜μ˜ 예제 μ½”λ“œλ₯Ό 톡해 상속이 μ£ΌλŠ” μž₯점을 μ‚΄νŽ΄λ³΄μž.

class Student {
    void eat() {} // λ°₯λ¨ΉκΈ°
    void sleep() {} // 잠자기
    void study() {} // κ³΅λΆ€ν•˜κΈ°
}

class StudentDeveloper {
    void eat() {} // λ°₯λ¨ΉκΈ°
    void sleep() {} // 잠자기
    void study() {} // κ³΅λΆ€ν•˜κΈ°
    void develop() {} // κ°œλ°œν•˜κΈ°
}

class Professor {
    void eat() {} // λ°₯λ¨ΉκΈ°
    void sleep() {} // 잠자기
    void research() {} // μ—°κ΅¬ν•˜κΈ°
}
  • 학생(Student)κ³Ό ν•™μƒκ°œλ°œμž(StudentDeveloper) 그리고 ꡐ수(Professor)κ°€ μžˆλ‹€.
  • 이듀은 κ³΅ν†΅μ μœΌλ‘œ λ°₯λ¨ΉκΈ°(eat)와 잠자기(sleep) λΌλŠ” 곡톡적인 ν–‰μœ„(μ½”λ“œ)κ°€ μžˆλ‹€.
  • λ˜ν•œ 학생과 ν•™μƒκ°œλ°œμžλŠ” κ³΅ν†΅μ μœΌλ‘œ 곡뢀(study)λΌλŠ” 곡톡적인 ν–‰μœ„(μ½”λ“œ)κ°€ μ‘΄μž¬ν•œλ‹€.
  • 만일, λ°₯먹기와 잠자기의 방식이 λ‹€λ₯΄μ§€ μ•Šκ³  λ™μΌν•œ 역할을 ν•œλ‹€κ³  κ°€μ •ν•΄λ³΄μž. ν•˜λ‚˜μ˜ ν–‰μœ„λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•΄μ„œ μœ„μ˜ 3개 클래슀 λͺ¨λ‘λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ 생긴닀.

class structure

  • 상속을 μ΄μš©ν•˜λ©΄ μ•„λž˜μ™€ 같이 κ°„κ²°ν•˜κ²Œ μˆ˜μ •ν•  수 μžˆλ‹€.
class Person {
    void eat() {} // λ°₯λ¨ΉκΈ°
    void sleep() {} // 잠자기
}

class Student extends Person {
    void study() {} // κ³΅λΆ€ν•˜κΈ°
}

class StudentDeveloper extends Student {
    void develop() {} // κ°œλ°œν•˜κΈ°
}
  • 곡톡적인 νŠΉμ„±μ„ λ¬Άμ–΄μ„œ μ‚¬λžŒ(Person) 클래슀둜 μ •μ˜ν–ˆλ‹€.
  • 그리고 곡톡 νŠΉμ„±μ΄ ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ΄ 이λ₯Ό μƒμ†ν•˜μ—¬ μ‚¬μš©ν•˜λ„λ‘ ν•œλ‹€.

class structure with inheritance

  • 이처럼 상속은 클래슀 μ‚¬μ΄μ˜ 멀버λ₯Ό 쀑볡 μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” μž₯점이 μžˆλ‹€.
  • λ˜ν•œ 클래슀λ₯Ό κ³„μΈ΅μ μœΌλ‘œ λΆ„λ₯˜ν•  수 μžˆμ–΄ 효율적으둜 관리할 수 있게 ν•΄μ€€λ‹€.
  • κ·ΈλŸ¬λ―€λ‘œ 클래슀의 μž¬μ‚¬μš©κ³Ό ν™•μž₯을 ν†΅ν•œ μ†Œν”„νŠΈμ›¨μ–΄μ˜ 생산성을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.


상속 μ‚¬μš© 방법

μ„ μ–Έ 방법

  • μžλ°”μ—μ„œλŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 상속을 μ„ μ–Έν•œλ‹€.
  • class μ„œλΈŒ 클래슀 extends 수퍼 클래슀 처럼 μž‘μ„±ν•˜λ©΄ λœλ‹€.

μ‚¬μš© 방법

class Point {
    private int xPos, yPos;

    void setPoint(int xPos, int yPos) {
        this.xPos = x;
        this.yPos = y;
    }

    void showPoint() {
        System.out.println("(" + xPos + "," + yPos + ")");
    }
}

class ColorPoint extends Point {
    private String color;

    void setColor(String color) {
        this.color = color;
    }

    void showColorPoint() {
        showPoint(); // Point 클래슀의 showPoint λ©”μ„œλ“œ 호좜
        System.out.println("Color : " + color);
    }
}

public class ExampleTest {
    public static void main(String[] args) {
        Point p = new Point();
        p.setPoint(3, 4);
        p.shoWPoint():

        ColorPoint cp = new ColorPoint();
        cp.setPoint(2, 3);
        cp.setColor("Yellow");
        cp.showColorPoint();
    }
}
  • μ„œλΈŒ ν΄λž˜μŠ€λŠ” 상속을 ν†΅ν•˜μ—¬ 수퍼 클래슀의 멀버λ₯Ό μžμ‹ μ˜ λ©€λ²„λ‘œ ν™•μž₯ν•œλ‹€.
    • κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 수퍼 클래슀의 private 멀버 μ™Έμ˜ λͺ¨λ“  멀버에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • 즉, ColorPointλŠ” Point 클래슀λ₯Ό μƒμ†ν•¨μœΌλ‘œμ¨ μžμ‹ μ˜ 멀버 λ³€μˆ˜μΈ λ¬Έμžμ—΄ color뿐만 μ•„λ‹ˆλΌ Point 클래슀의 μ •μˆ˜ν˜• xPos, yPox도 κ°–κ²Œ λœλ‹€.
  • λ˜ν•œ μ„œλΈŒ 클래슀인 ColorPoint의 멀버 λ©”μ„œλ“œ showColorPointμ—μ„œλŠ” 수퍼 클래슀의 showPoint도 ν˜ΈμΆœν•  수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ xPos와 yPosλŠ” Point의 private λ©€λ²„μ΄λ―€λ‘œ Color 클래슀의 멀버듀이 μ ‘κ·Όν•  수 μ—†λ‹€.
    • λ”°λΌμ„œ setPoint와 showPoint λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ κ°„μ ‘μ μœΌλ‘œ μ ‘κ·Όν•œλ‹€.

μƒμ†μ˜ μ’…λ₯˜

  • μžλ°”μ—μ„œλŠ” C++처럼 public 상속, protected 상속 등을 λͺ…μ‹œν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μœ„μ—μ„œ μ–ΈκΈ‰ν•œ κ²ƒμ²˜λŸΌ μ„œλΈŒ 클래슀 extends 수퍼 클래슀둜만 μ„ μ–Έν•˜λ©° 수퍼 클래슀 λ©€λ²„λ“€μ˜ μ ‘κ·Ό μ§€μ •μžμ— λ”°λΌμ„œ 각각 λ‹€λ₯΄κ²Œ μ„œλΈŒ ν΄λž˜μŠ€μ— μƒμ†λœλ‹€.
class Point {
    private int privateVal;
    protected int protectedVal;
    public int publicVal;
    int defaultVal;
}

// 같은 νŒ¨ν‚€μ§€μ— μžˆλ‹€.
class ColorPoint extends Point {
    void someMethod() {
        privateVal = 1; // Error!
        protectedVal = 2;
        publicVal = 3;
        defaultVal = 4;
    }
}
수퍼 클래슀 멀버에 μ ‘κ·Όν•˜λŠ” 클래슀 μ’…λ₯˜ private default protected public
같은 νŒ¨ν‚€μ§€μ˜ 클래슀 X O O O
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 클래슀 X X X O
같은 νŒ¨ν‚€μ§€μ˜ μ„œλΈŒ 클래슀 X O O O
λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μ„œλΈŒ 클래슀 X X O O


상속과 μƒμ„±μž

수퍼 ν΄λž˜μŠ€μ™€ μ„œλΈŒ 클래슀의 μƒμ„±μž

  • 수퍼 ν΄λž˜μŠ€μ™€ μ„œλΈŒ 클래슀 λͺ¨λ‘ μƒμ„±μžλ₯Ό κ°€μ§€κ³  μžˆλ‹€.
  • μ„œλΈŒ 클래슀 객체가 생성될 λ•Œ, μ„œλΈŒ 클래슀의 μƒμ„±μžμ™€ 수퍼 클래슀의 μƒμ„±μžκ°€ λͺ¨λ‘ μ‹€ν–‰λœλ‹€.
  • μƒμ„±μžμ˜ λͺ©μ μ€ 객체 μ΄ˆκΈ°ν™”μ— 있기 λ•Œλ¬Έμ—, μ„œλΈŒ 클래슀의 μƒμ„±μžλŠ” μ„œλΈŒ 클래슀의 λ©€λ²„λ‚˜ ν•„μš”ν•œ μ΄ˆκΈ°ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.
  • 수퍼 클래슀의 μƒμ„±μžλŠ” 수퍼 클래슀의 λ©€λ²„λ‚˜ ν•„μš”ν•œ μ΄ˆκΈ°ν™”λ₯Ό 각각 μˆ˜ν–‰ν•œλ‹€.
  • 수퍼 클래슀의 μƒμ„±μžμ™€ μ„œλΈŒ 클래슀의 μƒμ„±μž μ€‘μ—μ„œ 수퍼 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€.
class Point {
    Point() {
        // λ¨Όμ € μ‹€ν–‰λœλ‹€.
        System.out.println("Point μƒμ„±μž μ‹€ν–‰");
    }
}

class ColorPoint extends Point {
    ColorPoint() {
        // 이후에 μ‹€ν–‰λœλ‹€.
        System.out.println("ColorPoint μƒμ„±μž μ‹€ν–‰");
    }
}

class ExampleTest {
    public static void main(String[] args) {
        ColorPoint cp = new ColorPoint();
    }
}
  • μ»΄νŒŒμΌλŸ¬λŠ” new λ¬Έμž₯이 μ‹€ν–‰λ˜λ©΄ ColorPoint μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.
  • κ·ΈλŸ¬λ‚˜ ColorPointλŠ” μžμ‹ μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 λ¨Όμ € 수퍼 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.
  • μ„œλΈŒ 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € ν˜ΈμΆœλ˜μ§€λ§Œ, κ²°κ΅­ 수퍼 클래슀의 μƒμ„±μžκ°€ λ¨Όμ € μ‹€ν–‰λœλ‹€.
  • μ–΄λ–€ μ„œλΈŒ ν΄λž˜μŠ€λ“ μ§€ μƒμ„±μžμ— λŒ€ν•΄ μ»΄νŒŒμΌλŸ¬λŠ” 수퍼 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œ λ’€ μžμ‹ μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ„λ‘ 컴파일 ν•œλ‹€.
    • μ΄λŠ” 수퍼 ν΄λž˜μŠ€κ°€ λ¨Όμ € μ΄ˆκΈ°ν™”λœ ν›„ 이λ₯Ό μƒμ†λ°›λŠ” μ„œλΈŒ ν΄λž˜μŠ€κ°€ μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

μ„œλΈŒ 클래슀의 수퍼 클래슀 μƒμ„±μž 호좜

  • 수퍼 클래슀의 μƒμ„±μžκ°€ μ—¬λŸ¬ 개 μžˆμ„ 수 μž‡λ‹€. λ¬Όλ‘  μ„œλΈŒ ν΄λž˜μŠ€λ„ λ§ˆμ°¬κ°€μ§€λ‹€.
  • 수퍼 클래슀의 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬λŠ” λ¬΅μ‹œμ μœΌλ‘œ 수퍼 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœλ˜λ„λ‘ μ»΄νŒŒμΌν•œλ‹€.
class Point {
    Point() {
        // κ°€μž₯ 첫 번째둜 μ‹€ν–‰λœλ‹€.
        System.out.println("Point κΈ°λ³Έ μƒμ„±μž");
    }

    Point(int x) {
        // μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.
        System.out.println("Point λ§€κ°œλ³€μˆ˜ μƒμ„±μž");
    }
}

class ColorPoint extends Point {
    ColorPoint() {
        // 두 번째둜 μ‹€ν–‰λœλ‹€.
        System.out.println("ColorPoint κΈ°λ³Έ μƒμ„±μž");
    }
}

class ExampleTest {
    public static void main(String[] args) {
        ColorPoint cp = new ColorPoint();
    }
}
  • 만일 수퍼 클래슀의 κΈ°λ³Έ μƒμ„±μžκ°€ μ„ μ–Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€λ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
  • μ„œλΈŒ 클래슀의 μƒμ„±μžλ‘œ 맀개 λ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ²Œ λ˜λŠ” κ²½μš°μ—λ„ μ»΄νŒŒμΌλŸ¬λŠ” λ¬΅μ‹œμ μœΌλ‘œ 수퍼 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•œλ‹€.
  • λͺ…μ‹œμ μœΌλ‘œ 수퍼 클래슀의 μƒμ„±μžλ₯Ό μ„ νƒν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€.
class Point {
    Point() {
        System.out.println("Point κΈ°λ³Έ μƒμ„±μž");
    }

    Point(int x) {
        System.out.println("Point λ§€κ°œλ³€μˆ˜ μƒμ„±μž");
    }
}

class ColorPoint extends Point {
    ColorPoint() {
        System.out.println("ColorPoint κΈ°λ³Έ μƒμ„±μž");
    }

    ColorPoint(int x) {
        super(x); // λ°˜λ“œμ‹œ λ©”μ„œλ“œ μ‹œμž‘ μœ„μΉ˜μ— μžˆμ–΄μ•Ό ν•œλ‹€.
        System.out.println("ColorPoint λ§€κ°œλ³€μˆ˜ μƒμ„±μž");
    }
}
  • super ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ 수퍼 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œλŠ” μ„œλΈŒ 클래슀의 μƒμ„±μž 첫 라인에 μžˆμ–΄μ•Ό ν•œλ‹€.
    • κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€. Constructor call must be the first statement in a constructor