관리 메뉴

Partially Committed

[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°2 (OOP) λ³Έλ¬Έ

πŸ’» Study !/JAVA

[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°2 (OOP)

WonderJay 2022. 7. 31. 14:47
728x90
λ°˜μ‘ν˜•
SMALL

λ³Έ ν¬μŠ€νŒ…μ€ μžλ°”μ˜ 정석 ꡐ재λ₯Ό κ³΅λΆ€ν•˜λ©°, κ°„λ‹¨νžˆ 정리/기둝 μš©λ„λ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬, 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ§€μ ν•΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

 


1. 상속(Inheritance)

  [μƒμ†μ˜ μ •μ˜μ™€ μž₯점]

μƒμ†μ΄λΌλŠ” 것은 κΈ°μ‘΄ 클래슀λ₯Ό ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 것을 λ§ν•˜λ©°, 이λ₯Ό μ΄μš©ν•˜λ©΄ 보닀 적은 μ–‘μ˜ μ½”λ“œλ‘œ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•  수 있고 관리가 μš©μ΄ν•΄μ§„λ‹€. μ΄λ₯Ό 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이고 쀑볡을 μ œκ±°ν•˜μ—¬ 생산성과 μœ μ§€λ³΄μˆ˜μ— 크게 κΈ°μ—¬ν•  수 μžˆκ²Œλœλ‹€. μžλ°”μ—μ„œ 상속을 κ΅¬ν˜„ν•˜λ €λ©΄ μƒˆλ‘œ μž‘μ„±ν•˜κ³ μž ν•˜λŠ” 클래슀 이름 뒀에 extends λ₯Ό μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.

 

class Child extends Parent { ... }

 

μœ„μ™€ 같이 ν•˜λ©΄ Child λΌλŠ” μƒˆλ‘œμš΄ Class λŠ” Parent λΌλŠ” Class λ‘œλΆ€ν„° μƒμ†λ°›λŠ”λ‹€λŠ” 것이닀. μ΄λŸ¬ν•œ κ΄€κ³„μ—μ„œ Parent λŠ” 쑰상 클래슀(λΆ€λͺ¨/parent 클래슀, μƒμœ„/super 클래슀, 기반/base 클래슀) 라고 ν•˜λ©°, Child λŠ” μžμ† 클래슀(μžμ‹/child, ν•˜μœ„/sub, νŒŒμƒ/derived) 라고 ν•œλ‹€. 클래슀 κ°„μ˜ 관계λ₯Ό 그림으둜 ν‘œν˜„ν•˜κΈ°λ„ ν•˜λŠ”λ° μ΄λŠ” 상속계측도(class hierarchy) 라고 ν•œλ‹€. 

https://www.researchgate.net/figure/The-asset-class-hierarchy_fig2_228584037

 

Parent ν΄λž˜μŠ€μ— 멀버 λ³€μˆ˜λ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜λ©΄ μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 멀버λ₯Ό λͺ¨λ‘ μƒμ†λ°›μ•„μ„œ, child ν΄λž˜μŠ€μ—λŠ” μžλ™μ μœΌλ‘œ ν•΄λ‹Ή 멀버 λ³€μˆ˜λ₯Ό κ°€μ§€κ²Œ λœλ‹€. 그러면 λ°˜λŒ€λ‘œ μžμ‹ ν΄λž˜μŠ€μ— λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜λ©΄ μ–΄λ–»κ²Œ 될까? child ν΄λž˜μŠ€μ— μΆ”κ°€μ μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ”λΌλ„ Parent ν΄λž˜μŠ€λŠ” μ•„λ¬΄λŸ° 영ν–₯을 받지 μ•ŠλŠ”λ‹€. μžμ† ν΄λž˜μŠ€λŠ” 쑰상 클래슀의 λͺ¨λ“  멀버듀을 상속받기 λ•Œλ¬Έμ—, 상속을 κ±°λ“­ν•  수둝 μžμ‹ ν΄λž˜μŠ€λŠ” 더 λ§Žμ€ 멀버λ₯Ό κ°€μ§€κ²Œ 될 것이닀. 상속을 λ°›λŠ”λ‹€λŠ” 것은 κ·Έλž˜μ„œ 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° ν™•μž₯(extend)λœλ‹€λŠ” κ°œλ…μœΌλ‘œ 이해할 수 있고, 이것이 상속을 μ§€μ •ν•˜λŠ” ν‚€μ›Œλ“œκ°€ extends 인 μ΄μœ κ°€ λ˜κΈ°λ„ ν•œλ‹€.

 

- μƒμ„±μžμ™€ μ΄ˆκΈ°ν™” λΈ”λŸ­μ€ μƒμ†λ˜μ§€ μ•ŠμœΌλ©°, λ©€λ²„λ§Œ μƒμ†λœλ‹€.

- λ˜ν•œ μžμ† 클래슀의 멀버 κ°œμˆ˜λŠ” 쑰상 ν΄λž˜μŠ€λ³΄λ‹€ 항상 κ°™κ±°λ‚˜ λ§Žλ‹€.

 

Parent ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 Child, Child2 ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. 각각의 ν΄λž˜μŠ€λŠ” 상속받은 ν΄λž˜μŠ€μ™€μ˜ 멀버λ₯Ό κ³΅μœ ν•˜λ‚˜, Child 와 Child2 λŠ” μ„œλ‘œ μ•„λ¬΄λŸ° 관계도 μ„±λ¦½λ˜μ§€ μ•ŠμŒμ— μ£Όμ˜ν•˜μž. 클래슀 κ°„μ˜ κ΄€κ³„μ—μ„œλŠ” λΆ€λͺ¨ - μžμ‹ κ΄€κ³„λ§Œ μ‘΄μž¬ν•˜λ©°, ν˜•μ œ κ΄€κ³„λŠ” 고렀치 μ•ŠλŠ”λ‹€. 상속 관계가 λ³΅μž‘ν•΄μ§€λ”λΌλ„ μ½”λ“œμ˜ 변경이 ν•„μš”ν•œ 경우, μ΅œμƒλ‹¨ 클래슀의 μ½”λ“œλ§Œ λ³€κ²½ν•˜λ©΄ λͺ¨λ‘ 반영되기 λ•Œλ¬Έμ— μ½”λ“œμ˜ 쀑볡을 λ°©μ§€ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μ›Œμ§„λ‹€.

 

class Parent {...}

class Child extends Parent { ... }

class Child2 extends Parent { ... }

class GrandChild extends Child { ... }

 

μœ„μ™€ 같이 μž‘μ„±ν•˜λ©΄, GrandChild ν΄λž˜μŠ€λŠ” Child ν΄λž˜μŠ€μ™€ Parent 클래슀의 λͺ¨λ“  멀버λ₯Ό μƒμ†λ°›λŠ”λ‹€. μ΄λŸ¬ν•œ 경우 GrandChild ν΄λž˜μŠ€μ™€ Parent ν΄λž˜μŠ€λŠ” μ„œλ‘œ κ°„μ ‘ 상속 관계에 λ†“μ—¬μžˆλ‹€κ³  ν‘œν˜„ν•œλ‹€. Parent ν΄λž˜μŠ€μ— ν•˜λ‚˜μ˜ 멀버 λ³€μˆ˜λ₯Ό μΆ”κ°€ν•œλ‹€λ©΄, Child, Child2 ν΄λž˜μŠ€λŠ” 이λ₯Ό μƒμ†λ°›λŠ”λ‹€. 그리고 GrandChild 클래슀 λ˜ν•œ Child 클래슀λ₯Ό μƒμ†λ°›μœΌλ―€λ‘œ λ°˜μ˜λœλ‹€. 전체 ν”„λ‘œκ·Έλž¨μ„ κ΅¬μ„±ν•˜λŠ” ν΄λž˜μŠ€λ“€μ„ μ μ ˆν•˜κ²Œ μ„€κ³„ν•΄μ£ΌλŠ” 것이 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 뢀뢄이닀.

class Tv{
    boolean power;
    int channel;

    void power(){power = !power;}
    void channelUp(){++channel;}
    void channelDown(){--channel;}
}

class CaptionTv extends Tv{
    boolean caption;
    void displayCaption(String text){
        if(caption){
            System.out.println(text);
        }
    }
}

class source{
    public static void main(String[] args) {
        CaptionTv ctv = new CaptionTv();
        ctv.channel = 10;
        ctv.channelUp();
        System.out.println(ctv.channel);
        ctv.displayCaption("Hello, World");
        ctv.caption = true;
        ctv.displayCaption("Hello, World");
    }
}

μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄,

쑰상 클래슀의 멀버와 μžμ† 클래슀의 멀버가 합쳐진 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ‘œ μƒμ„±λœλ‹€.

 

[클래슀 κ°„μ˜ 관계 - 포함관계]

상속을 ν†΅ν•΄μ„œ 클래슀 κ°„ 관계λ₯Ό λ§Œλ“€κ³  μž¬μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜λŠ”λ° 상속 외에도 클래슀λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 또 λ‹€λ₯Έ 방법은 포함(Composite) 관계λ₯Ό λ§Œλ“€μ–΄ μ£ΌλŠ” 것이닀. μ΄λŠ” ν•˜λ‚˜μ˜ 클래슀의 λ©€λ²„λ³€μˆ˜λ‘œ λ‹€λ₯Έ 클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 것을 λ§ν•œλ‹€. 

class Point{
    int x;
    int y;
}
class Circle{
    Point c = new Point();
    int r;
}

μœ„μ™€ 같이 ν•˜λ‚˜μ˜ 클래슀λ₯Ό μž‘μ„±ν•  λ•Œ, λ‹€λ₯Έ 클래슀λ₯Ό λ©€λ²„λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ—¬ ν¬ν•¨μ‹œν‚€λ©΄ 보닀 κ°„κ²°ν•˜κ²Œ 클래슀λ₯Ό μž‘μ„±ν•  수 μžˆλ‹€. 

 

[클래슀 κ°„μ˜ 관계 κ²°μ •ν•˜κΈ°]

클래슀λ₯Ό μž‘μ„±ν•  λ•Œ 상속관계λ₯Ό μ‚¬μš©ν•  지, 포함 관계λ₯Ό μ‚¬μš©ν•  지 μ •ν•΄μ£ΌλŠ” 것은 λ‹€μ†Œ λͺ¨ν˜Έν•œ 점이 μžˆμ„ 수 μžˆλ‹€. 클래슀λ₯Ό 가지고 λ¬Έμž₯을 λ§Œλ“€μ—ˆμ„ λ•Œ, ~은 ~이닀 λΌλŠ” λ¬Έμž₯이 μžμ—°μŠ€λŸ½λ‹€λ©΄ 상속 관계가 쒋을 것이고 ~은 ~을 가지고 μžˆλ‹€λŠ” λ¬Έμž₯이 μžμ—°μŠ€λŸ½λ‹€λ©΄ 포함 관계가 쒋을 것이닀. 

class Shape{
    String color = "black";
    void draw(){
        System.out.printf("[Color = %s]\n", color);
    }
}
class Point{
    int x;
    int y;

    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
    Point() {
        this(0, 0);
    }
    String getXY(){
        return "(" + x + "," + y + ")";
    }
}
class Circle extends Shape{
    Point center;
    int r;

    Circle(){
        this(new Point(0, 0), 100);
    }
    Circle(Point center, int r){
        this.center = center;
        this.r = r;
    }
    void draw(){
        System.out.printf("[center = (%d, %d), r = %d, color = %s\n",
                center.x, center.y, r, color);
    }
}
class Triangle extends Shape{
    Point[] p = new Point[3];
    Triangle(Point[] p){
        this.p = p;
    }
    void draw(){
        System.out.printf("[p1=%s, p2 = %s, p3=%s, color = %s\n",
                p[0].getXY(), p[1].getXY(), p[2].getXY(), color);
    }
}
class source{
    public static void main(String[] args) {
        Point[] p = { new Point(100, 100),
                      new Point(140, 50),
                      new Point(200, 100)
        };

        Triangle t = new Triangle(p);
        Circle c = new Circle(new Point(150, 150), 50);

        t.draw();
        c.draw();
    }
}

class source {
    public static void main(String[] args) {
        Deck d = new Deck();
        Card c = d.pick(0);
        System.out.println(c.toString());

        d.shuffle();
        c = d.pick();
        System.out.println(c);
        // μ°Έμ‘° λ³€μˆ˜μ˜ 좜λ ₯μ΄λ‚˜ λ§μ…ˆμ—°μ‚°μžλ₯Ό μ΄μš©ν•œ μ°Έμ‘°λ³€μˆ˜μ™€ λ¬Έμžμ—΄μ˜ κ²°ν•©μ—λŠ” toString() 이 μžλ™μ μœΌλ‘œ ν˜ΈμΆœλ˜μ–΄
        // μ°Έμ‘° λ³€μˆ˜λ₯Ό λ¬Έμžμ—΄λ‘œ λŒ€μΉ˜ν•œ 뒀에 μ²˜λ¦¬ν•œλ‹€.
        // toString() 은 λͺ¨λ“  클래슀의 쑰상인 Object ν΄λž˜μŠ€μ— μ •μ˜λœ 것이닀.
    }
}

class Deck {
    final int CARD_NUM = 52;
    Card cardArr[] = new Card[CARD_NUM];

    Deck() {
        int i = 0;
        for (int k = Card.KIND_MAX; k > 0; k--)
            for (int n = 0; n < Card.NUM_MAX; n++)
                cardArr[i++] = new Card(k, n + 1);
    }

    Card pick(int index) {
        return cardArr[index];
    }

    Card pick() {
        int index = (int) (Math.random() * CARD_NUM);
        return pick(index);
    }

    void shuffle() {
        for (int i = 0; i < cardArr.length; i++) {
            int r = (int) (Math.random() * CARD_NUM);

            Card temp = cardArr[i];
            cardArr[i] = cardArr[r];
            cardArr[r] = temp;
        }
    }
}

class Card {
    static final int KIND_MAX = 4;
    static final int NUM_MAX = 13;
    static final int SPADE = 4;
    static final int DIAMOND = 3;
    static final int HEART = 2;
    static final int CLOVER = 1;

    int kind;
    int number;

    Card() {
        this(SPADE, 1);
    }

    Card(int kind, int number) {
        this.kind = kind;
        this.number = number;
    }

    public String toString() {
        String[] kinds = {"", "Clover", "Heart", "Diamond", "Spade"};
        String numbers = "0123456789XJQK";

        return "kind = " + kinds[this.kind] + ", number = " + numbers.charAt(this.number);
    }
}

 

[단일 상속: Single Inheritance]

  C++ μ—μ„œλŠ” μ—¬λŸ¬ 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ†λ°›λŠ” 닀쀑 상속(Multiple inheritance)을 ν—ˆμš©ν•˜λ‚˜ μžλ°”μ—μ„œλŠ” μ˜€λ‘œμ§€ 단일 μƒμ†λ§Œμ΄ ν—ˆμš©λœλ‹€. 닀쀑 상속을 μ‚¬μš©ν•  수 있으면 μ—¬λŸ¬ 클래슀둜 λΆ€ν„° μƒμ†λ°›λŠ” 볡합적인 κΈ°λŠ₯을 κ°€μ§€λŠ” 클래슀λ₯Ό μ‰½κ²Œ 섀계할 수 μžˆμ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버 κ°„μ˜ 이름이 λ§Œμ•½ κ²ΉμΉ˜λŠ” κ²½μš°μ—λŠ” ꡬ별할 수 μ—†λ‹€λŠ” 큰 단점이 μ‘΄μž¬ν•œλ‹€. 이λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” ν•œκ°€μ§€ 방법은 쑰상 클래슀의 λ©”μ„œλ“œ μ΄λ¦„μ΄λ‚˜ λ§€κ°œλ³€μˆ˜λ₯Ό λ°”κΎΈλŠ” μˆ˜κ°€ μžˆμ§€λ§Œ, 이러면 쑰상 클래슀의 κ²ΉμΉ˜λŠ” 이름을 가진 λ©”μ„œλ“œ/λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“  클래슀λ₯Ό λ³€κ²½ν•΄μ•Ό ν•˜λ―€λ‘œ κ²°μ½” κ°„λ‹¨μΉ˜ μ•Šμ€ 방법이닀. μžλ°”μ—μ„œλŠ” 닀쀑 μƒμ†μ˜ μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ‹€μ€‘μƒμ†μ˜ μž₯점을 과감히 ν¬κΈ°ν•˜κ³  단일 μƒμ†λ§Œ ν—ˆμš©ν•˜μ˜€λ”°. 단일 상속은 ν•˜λ‚˜μ˜ 쑰상 클래슀만 κ°€μ§ˆ 수 μžˆμ–΄ λ‹€μ†Œ λΆˆνŽΈν•œ 점이 μžˆμ„ 수 μžˆμ§€λ§Œ, μ•„λ¬΄λž˜λ„ 클래슀 κ°„μ˜ 관계가 보닀 λͺ…확해지고 신뒰성이 λ†’μ•„μ§„λ‹€λŠ” 것이 큰 μž₯점이닀. λ‹¨μΌμƒμ†λ§Œ ν—ˆμš©ν•˜μ§€λ§Œ, 포함관계λ₯Ό 적절히 ν™œμš©ν•˜λ©΄ 효율적인 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.

 

[Object 클래슀 - λͺ¨λ“  클래슀의 쑰상]

  Object ν΄λž˜μŠ€λŠ” λͺ¨λ“  클래슀 상속 κ³„μΈ΅λ„μ˜ μ΅œμƒμœ„ 쑰상 클래슀둜, λ‹€λ₯Έ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받지 μ•ŠλŠ” λͺ¨λ“  ν΄λž˜μŠ€λŠ” Object ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속을 λ°›λŠ”λ‹€. μ•„λ¬΄λŸ° 상속을 받지 μ•ŠλŠ” 클래슀λ₯Ό μ •μ˜ν•˜λ©΄ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μžλ™μ μœΌλ‘œ extends Object λ₯Ό μΆ”κ°€ν•œλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μžλ°”μ΄ λͺ¨λ“  ν΄λž˜μŠ€λ“€μ€ Object 클래슀의 멀버듀을 상속받기 λ•Œλ¬Έμ—, Object 클래슀 λ‚΄λΆ€μ˜ 멀버듀을 μ‚¬μš©ν•  수 μžˆλ‹€. toString() μ΄λ‚˜ equals(Object o) 와 같은 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆμ—ˆλ˜ μ΄μœ λŠ” 이와 같이 Object ν΄λž˜μŠ€μ— μ˜ν•˜μ—¬ μƒμ†λ°›μ•˜κΈ° λ•Œλ¬Έμ΄λ‹€. Object ν΄λž˜μŠ€μ— λŒ€ν•΄μ„œλŠ” 이후에 μžμ„Έν•˜κ²Œ 닀루어보도둝 ν•˜μž.

 

 

 

2. μ˜€λ²„λΌμ΄λ”©(overriding)

  [μ˜€λ²„λΌμ΄λ”©μ˜ μ •μ˜]

쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것을 μ˜€λ²„λΌμ΄λ”©μ΄λΌκ³  ν•œλ‹€. 상속 받은 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ— 맞게 적절히 λ³€κ²½ν•΄μ•Όν•˜λŠ” κ²½μš°μ— 쑰상 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œλ‹€. 

class Point{
    int x;
    int y;
    String getLocation(){
        return "x :" + x + ", y :" + y;
    }
}
class Point3D extends Point{
    int z;
    String getLocation(){
        return "x: " + x + ", y : " + y  + ", z :" + "z";
    }
}

Point 클래슀의 getLocation 은 2차원 μ’Œν‘œλ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μž‘μ„±λ˜μ—ˆμœΌλ‚˜, Point 의 μžμ‹ 클래슀인 Point3D ν΄λž˜μŠ€λŠ” 3차원 μ’Œν‘œκ³„λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ κ²ƒμ΄λ―€λ‘œ, 상속받은 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•œλ‹€. μƒˆλ‘­κ²Œ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κΈ° λ³΄λ‹€λŠ” μ˜€λ²„λΌμ΄λ”©μ„ ν•˜λŠ” 것이 μ’‹λ‹€.

 

[μ˜€λ²„λΌμ΄λ”©μ˜ 쑰건]

μ˜€λ²„λΌμ΄λ”©μ€ 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©λ§Œμ„ μˆ˜μ •ν•˜λŠ” κ²ƒμœΌλ‘œ, μ„ μ–ΈλΆ€λŠ” 쑰상과 μ™„μ „νžˆ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ˜€λ²„λΌμ΄λ”©μ΄ μ„±λ¦½ν•˜λ €λ©΄ μ•„λž˜ 쑰건을 λ§Œμ‘±ν•΄μ•Όλ§Œ ν•œλ‹€.

 

μžμ† ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ„œλ“œλŠ”  쑰상 클래슀의 λ©”μ„œλ“œμ™€

1. 이름이 κ°™μ•„μ•Ό ν•œλ‹€.

2. λ§€κ°œλ³€μˆ˜κ°€ κ°™μ•„μ•Ό ν•œλ‹€.

3. λ°˜ν™˜νƒ€μž…μ΄ κ°™μ•„μ•Ό ν•œλ‹€.

 

 μ„ μ–ΈλΆ€κ°€ μ„œλ‘œ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€λŠ” 것인데, μ ‘κ·Ό μ œμ–΄μž(access modifier)와 μ˜ˆμ™Έ(exception)λŠ” μ œν•œλœ 쑰건 ν•˜μ—μ„œλ§Œ λ‹€λ₯΄κ²Œ λ³€κ²½ν•  수 μžˆκΈ°λ„ ν•˜λ‹€.

 

  • μ ‘κ·Ό μ œμ–΄μžλŠ” 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ μ’μ€λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†λ‹€.
    λ§Œμ•½ 쑰상 ν΄λž˜μŠ€μ— μ •μ˜λœ λ©”μ„œλ“œμ˜ μ ‘κ·Ό μ œμ–΄μžκ°€ protected 이면, ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ„œλ“œλŠ” public μ΄κ±°λ‚˜ protected μ—¬μ•Όλ§Œ ν•œλ‹€. λŒ€λΆ€λΆ„ 같은 μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•œλŠλ°, μ ‘κ·Ό λ²”μœ„λŠ” public > protected, default, private 순으둜 λ„“λ‹€.
  • 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ λ§Žμ€ 수의 μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†λ‹€.

    class Parent{
              void parentMethod() throws IOException, SQLException{
                ...

             }
    }
    class Child extends Parent{
              void parentMethod() throws IOException{
                ...

             }
    }

    μœ„μ™€ 같이 μž‘μ„±ν•˜λ©΄ 쑰상 ν΄λž˜μŠ€λ³΄λ‹€ μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜ˆμ™Έμ˜ κ°œμˆ˜κ°€ μ μœΌλ―€λ‘œ μ˜€λ²„λΌμ΄λ”©μ΄ μ˜¬λ°”λ₯΄κ²Œ λ˜μ—ˆλ‹€κ³  ν•  수 μžˆλ‹€. μ€‘μš”ν•œ 것은 μ˜ˆμ™Έμ˜ κ°œμˆ˜κ°€ μ•„λ‹ˆλΌλŠ” 것에 μ£Όμ˜ν•˜μž.
    class Parent{
              void parentMethod() throws IOException, SQLException{
                ...

             }
    }
    class Child extends Parent{
              void parentMethod() throws Exception{
                ...

             }
    }
    λ§Œμ•½ μœ„μ™€ 같이 μž‘μ„±ν•œλ‹€λ©΄ Exception 은 λͺ¨λ“  μ˜ˆμ™Έμ˜ 졜고 μ‘°μƒμ΄λ―€λ‘œ μžμ‹ 클래슀의 μ˜ˆμ™Έμ˜ κ°œμˆ˜κ°€ 쑰상 클래슀의 μ˜ˆμ™Έμ˜ κ°œμˆ˜λ³΄λ‹€ λ§ŽμœΌλ―€λ‘œ μ˜€λ²„λΌμ΄λ”©μ˜ 쑰건을 λ§Œμ‘±ν•˜μ§€ λͺ»ν•œλ‹€.


쑰상 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ† ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© ν•  λ•Œμ—λŠ” μ•„λž˜ 3가지λ₯Ό κΈ°μ–΅ν•˜λ„λ‘ ν•˜μž.

1. μ ‘κ·Ό μ œμ–΄μžλ₯Ό 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 쒁은 λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†λ‹€.

2. μ˜ˆμ™ΈλŠ” 쑰상 클래슀의 λ©”μ„œλ“œλ³΄λ‹€ 많이 μ„ μ–Έν•  수 μ—†λ‹€.
3. μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œλ₯Ό static λ©”μ„œλ“œλ‚˜ λ°˜λŒ€λ‘œ λ³€κ²½ν•  수 μ—†λ‹€.

Q. 쑰상 ν΄λž˜μŠ€μ— μ •μ˜λœ static λ©”μ„œλ“œλ₯Ό μžμ† ν΄λž˜μŠ€μ—μ„œ λ™μΌν•œ μ΄λ¦„μ˜ static λ©”μ„œλ“œλ‘œ μ •μ˜ν•  수 μžˆμ„κΉŒ?

A. κ°€λŠ₯ν•˜μ§€λ§Œ, μ΄λŠ” μ˜€λ²„λΌμ΄λ”©μ€ μ•„λ‹ˆκ³  각각의 ν΄λž˜μŠ€μ— λ³„λ„μ˜ static λ©”μ„œλ“œλ₯Ό μ •μ˜ν•œ 것일 뿐이닀. static 멀버듀은 μžμ‹ λ“€μ΄ μ •μ˜λœ ν΄λž˜μŠ€μ— λ¬Άμ—¬μžˆλ‹€κ³  μƒκ°ν•˜λŠ” 것이 μžμ—°μŠ€λŸ¬μš°λ©° 호좜 μ‹œμ—λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ§€ 말고 ν΄λž˜μŠ€μ΄λ¦„.λ©”μ„œλ“œμ΄λ¦„() 으둜 ν•˜λŠ” 것이 μ’‹λ‹€.

 

Static μ‚¬μš©μ˜ μž₯단점 (좜처 :https://velog.io/@gudonghee2000/static-vs-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4#:~:text=%EC%B2%AB%EB%B2%88%EC%A7%B8%EB%8A%94%2C%20Static%EC%9D%B4%20%EB%A9%94%EB%AA%A8%EB%A6%AC,%EC%86%8D%EB%8F%84%EA%B0%80%20%EB%B9%A0%EB%A5%B4%EB%8B%A4%EB%8A%94%20%EA%B2%83%EC%9D%B4%EB%8B%A4.)

Static 은 클래슀 λ©”μ„œλ“œμ™€ 클래슀 ν•„λ“œλ₯Ό 지정할 λ•Œ μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ, μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ 클래슀의 λ©”μ„œλ“œμ™€ ν•„λ“œμ— 접근이 κ°€λŠ₯ν•˜λ„λ‘ ν•œλ‹€. 일반적으둜 μ‚¬μš©ν•˜λŠ” Class λŠ” Static μ˜μ—­μ— μƒμ„±λ˜κ³ , new operator 을 μ΄μš©ν•˜μ—¬ μƒμ„±ν•œ κ°μ²΄λŠ” Heap μ˜μ—­μ— μƒμ„±λœλ‹€. 
https://velog.io/@gudonghee2000/static-vs-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4#:~:text=%EC%B2%AB%EB%B2%88%EC%A7%B8%EB%8A%94%2C%20Static%EC%9D%B4%20%EB%A9%94%EB%AA%A8%EB%A6%AC,%EC%86%8D%EB%8F%84%EA%B0%80%20%EB%B9%A0%EB%A5%B4%EB%8B%A4%EB%8A%94%20%EA%B2%83%EC%9D%B4%EB%8B%A4.

Static 의 μž₯점은 μ•„λž˜μ™€ κ°™λ‹€.
1. λ©”λͺ¨λ¦¬ μΈ‘λ©΄μ—μ„œ νš¨μœ¨μ μ΄λ‹€. Static μ˜μ—­μ— μ €μž₯되면 κ³ μ •λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ 맀번 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄μ„œ λ‚­λΉ„λ˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό 쀄일 수 μžˆλ‹€.
2. 객체 생성 없이도 μ‚¬μš©κ°€λŠ₯ν•˜λ―€λ‘œ 속도가 빨라진닀. ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€λŠ” μ‹œμ μ— μƒμ„±λ˜μ–΄μ„œ μ‚¬μš©μ΄ λ°”λ‘œ λ˜λ―€λ‘œ 속도 λ©΄μ—μ„œ 이득이 μžˆλ‹€.

Static 의 단점은 μ•„λž˜μ™€ κ°™λ‹€.
1. ν”„λ‘œκ·Έλž¨ μ’…λ£Œ μ‹œκΉŒμ§€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ μ±„λ‘œ μ‘΄μž¬ν•œλ‹€.
Garbage Collector λ₯Ό ν†΅ν•΄μ„œ μˆ˜μ‹œλ‘œ κ΄€λ¦¬λ°›λŠ” Heap μ˜μ—­κ³Ό 달리 Static μ˜μ—­μ€ Garbage Collector 에 μ˜ν•œ 관리λ₯Ό 받지 μ•ŠκΈ° λ•Œλ¬Έμ— Static μ˜μ—­μ€ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ μ‹œ κΉŒμ§€ λ©”λͺ¨λ¦¬μ— μ‘΄μž¬ν•œλ‹€. λ§Œμ•½ Static 을 λ‚¨μš©ν•˜κ²Œ λœλ‹€λ©΄ μ’…λ£Œ μ‹œ κΉŒμ§€ λ§Žμ€ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœ μ±„λ‘œ μ‘΄μž¬ν•˜λ―€λ‘œ μ„±λŠ₯에 μ•…μ˜ν–₯을 주게 λœλ‹€.
2. Static 은 객체지ν–₯적이지 λͺ»ν•˜λ‹€. λ”°λ‘œ 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬μ˜ Static μ˜μ—­μ— ν• λ‹Ήλœ κ³³μ—μ„œ μ—¬λŸ¬ ν΄λž˜μŠ€λ“€μ΄ 데이터λ₯Ό λΆˆλŸ¬μ˜€λŠ” ꡬ쑰인데, μ΄λŸ¬ν•œ νŠΉμ§•μ€ 객체의 데이터듀이 μΊ‘μŠν™” λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 원칙을 λ‹€μ†Œ μœ„λ°˜ν•œλ‹€λŠ” 것이닀.
3. Static λ©”μ„œλ“œλŠ” interface κ΅¬ν˜„μ— μ‚¬μš© 될 수 μ—†λ‹€. Static λ©”μ„œλ“œλŠ” μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ£Όμ–΄ μžλ°”μ˜ μœ μš©ν•œ OOP κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것을 λ°©ν•΄ν•œλ‹€λŠ” 것이닀.

[μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ˜ 차이점]

μ˜€λ²„λ‘œλ”©(overloading) 은 기쑴에 μ—†λŠ” μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 것(new)

μ˜€λ²„λΌμ΄λ”©(overriding) 은 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것(change, modify)

μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž.

 

class Parent{void parentMethod() {}}class Child extends Parent {void parentMethod() {}  // μ˜€λ²„λΌμ΄λ”©void parentMethod(int i) {}  // μ˜€λ²„λ‘œλ”©

 

void childMethod() {}

void childMethod(int i) {}  // μ˜€λ²„λ‘œλ”©

void childMethod() {}  // 쀑볡 μ •μ˜ μ—λŸ¬}

 

[Super]

  super 은 쑰상 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 멀버λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ°Έμ‘° λ³€μˆ˜μ΄λ‹€. λ©€λ²„λ³€μˆ˜μ™€ μ§€μ—­λ³€μˆ˜μ˜ 이름이 겹치면 this λ₯Ό λΆ™μ—¬μ„œ κ΅¬λ³„ν–ˆλ“― 상속받은 멀버와 μžμ‹ μ˜ λ©€λ²„μ˜ 이름이 κ²ΉμΉ˜λŠ” κ²½μš°μ—λŠ” super 을 λΆ™μ—¬ ꡬ별이 κ°€λŠ₯ν•˜λ‹€. λ¬Όλ‘  상속받은 λ©€λ²„λŠ” μžμ† 클래슀의 λ©€λ²„μ΄λ―€λ‘œ this λ₯Ό μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, 쑰상 클래슀의 멀버와 μžμ† 클래슀의 멀버가 쀑볡 μ •μ˜λ˜μ–΄ κ΅¬λ³„ν•΄μ•Όν•œλ‹€λ©΄ super 을 μ‚¬μš©ν•˜λ„λ‘ ν•˜μž.

 

  μ‘°μƒμ˜ 멀버와 μžμ‹ μ˜ 멀버λ₯Ό κ΅¬λ³„ν•΄μ•Όν•œλ‹€λŠ” 점을 μ œμ™Έν•˜λ©΄ super 와 this λŠ” 근본적으둜 κ°™λ‹€. λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—λŠ” μžμ‹ μ΄ μ†ν•œ μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ 지역 λ³€μˆ˜λ‘œ μ €μž₯λœλ‹€. μ΄λŠ” this 와 super 의 값이 λœλ‹€. static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€μ™€ κ΄€λ ¨ μ—†μœΌλ©°, this 와 λ§ˆμ°¬κ°€μ§€λ‘œ super λŠ” static λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•  수 μ—†κ³  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—μ„œλ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

class source{
    public static void main(String[] args) {
        Child c = new Child();
        c.method();
    }
}
class Parent{
    int x = 10;
}
class Child extends Parent{
    int x = 20;

    void method(){
        System.out.println("x=" + x);
        System.out.println("this.x = " + this.x);
        System.out.println("super.x = " + super.x);
    }
}

μœ„ μ˜ˆμ œμ—μ„œλŠ” λΆ€λͺ¨ 클래슀인 Parent μ—μ„œλ„ x λΌλŠ” λ³€μˆ˜κ°€ 있고, μžμ‹ ν΄λž˜μŠ€μ—μ„œλ„ x λΌλŠ” λ³€μˆ˜κ°€ μ‘΄μž¬ν•œλ‹€. μ€‘λ³΅μ •μ˜λœ 것이고 이λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄, super 을 μ‚¬μš©ν•œλ‹€. λ³€μˆ˜ 뿐만이 μ•„λ‹ˆλΌ λ©”μ„œλ“œλ„ super 을 μ‚¬μš©ν•˜μ—¬ 호좜이 κ°€λŠ₯ν•˜λ‹€. 쑰상 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•œ κ²½μš°μ— super 을 μ‚¬μš©ν•œλ‹€. 

class Point{
    int x; int y;
    String getLocation(){
        return "x :" + x + ", y :" + y;
    }
}
class Point3D extends Point{
    int z;
    String getLocation(){
        return super.getLocation() + ", z : " + z;
    }
}

μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œκ°€ 쑰상 클래슀의 λ©”μ„œλ“œμ˜ λ‚΄μš©μ— 좔가적인 μž‘μ—…μ„ ν•˜λŠ” 경우라면 super 을 μ΄μš©ν•˜μ—¬ 쑰상 클래슀의 λ©”μ„œλ“œλ₯Ό ν¬ν•¨μ‹œν‚€λŠ” 것이 이후에 μ‘°μƒν΄λž˜μŠ€μ˜ λ©”μ„œλ“œκ°€ λ³€κ²½λ˜λ”λΌλ„ μžμ† 클래슀의 λ©”μ„œλ“œμ—λ„ μžλ™ 반영 될 것이기 λ•Œλ¬Έμ— νš¨μœ¨μ μ΄λ‹€.

 

[Super() - 쑰상 클래슀의 μƒμ„±μž]

this() 와 λ§ˆμ°¬κ°€μ§€λ‘œ super() 도 μƒμ„±μžμ΄λ‹€. this() λŠ” 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•˜μ§€λ§Œ, super() 은 쑰상 클래슀의 μƒμ„±μž ν˜ΈμΆœμ— μ‚¬μš©λœλ‹€. μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄, μžμ† 멀버와 μ‘°μƒμ˜ 멀버가 λͺ¨λ‘ 합쳐진 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€κ°€ λ§Œλ“€μ–΄μ§„λ‹€. κ·Έλž˜μ„œ μžμ† ν΄λž˜μŠ€μ—μ„œ 쑰상 클래슀의 멀버λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 것이닀. μ΄λ•Œ 쑰상 클래슀 λ©€λ²„μ˜ μ΄ˆκΈ°ν™” μž‘μ—…μ΄ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ, μžμ† 클래슀의 μƒμ„±μžμ—μ„œ 쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœλ˜μ–΄μ•Όν•œλ‹€. (μžμ† 클래슀의 멀버가 쑰상 클래슀의 멀버λ₯Ό μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— 쑰상 클래슀의 λ©€λ²„μ˜ μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•œ 것이닀.) μ΄λŸ¬ν•œ 쑰상 클래슀의 μƒμ„±μžλŠ” 계측 관계λ₯Ό 거슬러 μ˜¬λΌκ°€ κ²°κ΅­ 졜고 쑰상인 Object 클래슀의 μƒμ„±μžμΈ Object() κΉŒμ§€ μˆ˜ν–‰λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ Object μƒμ„±μžλ₯Ό μ œμ™Έν•œ λͺ¨λ“  클래슀의 μƒμ„±μžλŠ” 첫 번째 쀄에 λ°˜λ“œμ‹œ λ‹€λ₯Έ μƒμ„±μžλ‚˜ μ‘°μƒμ˜ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜λ©°, 그렇지 μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μƒμ„±μžμ˜ 첫 쀄에 super(); κ°€ μžλ™μ μœΌλ‘œ μΆ”κ°€λœλ‹€.

 

Object 클래슀λ₯Ό μ œμ™Έν•œ λͺ¨λ“  클래슀의 μƒμ„±μž 첫 쀄에 μƒμ„±μž.this() ν˜Ήμ€ super() 을 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

그렇지 μ•ŠμœΌλ©΄ μ»΄νŒŒμΌλŸ¬λŠ” μžλ™μœΌλ‘œ super(); λ₯Ό μƒμ„±μž 첫 쀄에 μ‚½μž…ν•œλ‹€.

 

class source{
    public static void main(String[] args) {
        Point3D p3 = new Point3D(1, 2, 3);
    }
}

class Point{
    int x; int y;
    Point(){
        this(0, 0);
    }
    Point(int x, int y){
        this.x = x;
        this.y = y;
    }
    String getLocation(){
        return "x :" + x + ", y :" + y;
    }
}
class Point3D extends Point{
    int z;
    Point3D(int x, int y, int z)
    {
        // super();
        this.x =x;
        this.y = y;
        this.z = z;
    }
    String getLocation(){
        return super.getLocation() + ", z : " + z;
    }
}

 

Point 클래슀λ₯Ό 상속받은 Point3D ν΄λž˜μŠ€λŠ” Point3D μƒμ„±μžμ—μ„œ 쑰상 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  있기 λ•Œλ¬Έμ—, 컴파일 μ‹œ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μƒμ„±μžμ˜ 첫 쀄에 super(); κ°€ μ‹€ν–‰λœλ‹€. 이에 μ˜ν•΄ 쑰상 클래슀인 Point() κ°€ μ‹€ν–‰λœλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ Point ν΄λž˜μŠ€λŠ” Object 클래슀λ₯Ό μƒμ†λ°›λŠ”λ°, μƒμ„±μžμ—μ„œ 상속받은 쑰상 클래슀의 μƒμ„±μžκ°€ μ—†κΈ° λ•Œλ¬Έμ— point() μƒμ„±μžμ˜ 첫 쀄에 μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ super(); κ°€ μžλ™μœΌλ‘œ μΆ”κ°€/μ‹€ν–‰λ˜λ©° μ΄λŠ” Object() λ₯Ό μ˜λ―Έν•œλ‹€. 


References

http://www.yes24.com/Product/Goods/24259565

 

Java의 정석 - YES24

졜근 7λ…„λ™μ•ˆ μžλ°” λΆ„μ•Όμ˜ 베슀트 μ…€λŸ¬ 1μœ„λ₯Ό μ§€μΌœμ˜¨ `μžλ°”μ˜ 정석`의 μ΅œμ‹ νŒ. μ €μžκ°€ μΉ΄νŽ˜μ—μ„œ 12λ…„κ°„ 직접 λ…μžλ“€μ—κ²Œ 닡변을 ν•΄μ˜€λ©΄μ„œ μ΄ˆλ³΄μžκ°€ μ–΄λ €μ›Œν•˜λŠ” 뢀뢄을 잘 νŒŒμ•…ν•˜κ³  μ“΄ μ±…. 뿐만 μ•„

www.yes24.com

 

 

728x90
λ°˜μ‘ν˜•
LIST
Comments