Java/객체지향

[객체지향][자바의 정석] - 7.1 상속(inheritance)

얄루몬 2021. 11. 4. 19:13

7.1 상속(inheritance)

 

 

 

1. 상속의 정의와 장점

▶ 상속이란? 

    - 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것

    - 두 클래스를 조상과 자손으로 관계를 맺어주는 것

    - 자손은 조상의 모든 멤버를 상속 받는다. (생성자와 초기화 블럭은 제외한다.)

    - 자손의 멤버개수는 조상보다 적을 수 없다. (같거나 많아야 한다.)

class 자손클래스 extends 조상클래스{
    // ... 
}

상속의 개념

 

 

 

2. 클래스간의 관계 - 상속관계(inheritance)

    - 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.

    - 조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다.

조상의 변경은 영향 O / 자손의 변경은 영향 X

 

 

2. 클래스간의 관계 - 포함관계(composite)

▶ 포함(composite)이란?

    - 한 클래스의 멤버변수로 다른 클래스를 선언하는 것

    - 작은 단위의 클래스를 먼저 만들고, 이들을 조합해서 하나의 커다란 클래스를 만든다.

class circle{
    int x; // 원점의 x좌표
    int y; // 원점의 y좌표
    int r; // 반지름(radius)
}

 

 

class Point{
    int x;
    int y;
}
class circle{
    Point c = new Point(); // 원점 
    int r; // 반지름(radius)
}

 

 

3. 클래스간의 관계결정하기 - 상속 VS 포함

    - 가능한 많은 관계를 맺어주어 재사용성을 높이고 관리하기 쉽게 만든다.

    - 'is - a'와 'has - a'를 가지고 문장을 만들어 본다.

원(circle)은 점(point)이다.
원(circle)은 점(point)을 가지고 있다. 
상속관계 - '~은 ~이다. (is ~ a)'
포함관계 - '~은 ~을 가지고 있다. (has ~ a)'

 

Ex) 클래스간의 관계결정

- 원은 도형이다. -> 상속관계

- 원은 점을 가지고 있다.  -> 포함관계

상속 관계

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

    Deck(){
        int i = 0;
        for (int k = Card.KIND_MAX; k > 0 ; k-- ){
            for(int n = 1; n<Card.NUM_MAX+1;n++){
                c[i++] = new Card(k,n);
            }
        }
    }
    Card pick(int index){
        return c[index%CARD_NUM] //지정된 위치에 있는 카드 하나를 선택한다. 
    }
    Card pick(){
        int index = (int)(Math.random()*CARD_NUM); // 덱에서 카드를 하나 선택한다.
        return pick(index)
    }
    void shuffle() {  // 카드 순서 섞기 
        for(int n = 0l n < 1000; n++){
            int i = (int)(Math.random()*CARD_NUM);
            Card temp = c[0];
            c[0] = c[i]
            c[i] = temp
        }
    }
}

 

 

4. 단일 상속(single inheritance)

자바는 단일 상속만을 허용한다 (C++의 경우엔 다중상속을 허용한다.)

class TVCR extends TV, VCR{ //이와 같은 표현 허용 X
    //...
}

 

 

 

5. Object 클래스 - 모든 클래스의 최고조상 

- 조상이 없는 클랫는 자동적으로 Object 클래스를 상속받게 된다.

- 상속계층도의 최상위에는 Object 클래스가 위치한다.

- 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다. toString(), equals(Object obj), hashCode(), ....