본문으로 바로가기

[Java] 상속(Inheritance)

category Language/Java 2020. 1. 18. 00:56

1.상속이란?

상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.


상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고

코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.

 

  • 조상 클래스 : 상속해주는 클래스 ( 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스 )
  • 자손 클래스 : 상속 받는 클래스 ( 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스 )

상속의 관계

  • 생성자와 초기화 블럭은 상속되지 않는다. (멤버만 상속)
  • 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

부모, 자식 클래스 관계

  • 클래스 Child와 Child2가 모두 Parent클래스를 상속받고 있다.
  • Parent클래스의 자손인 Child클래스와 Child2클래스는 조상의 멤버를 상속받기 때문에,
    Parent클래스에 새로운 멤버를 추가해주는 것은
    Child클래스와 Child2클래스에 새로운 멤버를 추가해주는 것과 같은 효과다.
  • 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에
    따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다. 

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

상속이외에도 클래스를 재사용하는 방법으로는 클래스 간에 포함(Composite)관계를 맺어주는 것이다.
클래스 간의 포함관계를 맺어 주는 것은 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 뜻한다.

<예제 코드>

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

class Point {
    int x;  // 원점의 x좌표
    int y;  // 원점의 y좌표
}

Point클래스를 재사용해서 Circle클래스를 작성한다.

class Circle {
    Point c = new Point(); // 원점
    int r;
}

단위별로 여러 개의 클래스를 작성한 다음, 이 단위 클래스들을 포함관계(멤버변수)로 재사용하면

보다 간결하고 손쉽게 클래스를 작성할 수 있다.

3. 클래스간의 관계 결정

  • 상속관계 : '~은 ~이다.(is-a)'
  • 포함관계 : '~은 ~을 가지고 있다.(has-a)'

예시)

Car클래스와 SportsCar클래스가 있을 때, SportsCar는 Car이다. -> 상속관계

Card클래스와 Deck클래스가 있을 때, Deck은 Card를 가지고 있다. -> 포함관계

 

<예제 코드>

class DeckTest {
    public static void main(String args[]) {
        Deck d = new Deck();     // 카드 한 벌을 만든다.
        Card c = d.pick(0);      // 섞기 전에 제일 위의 카드를 뽑는다. cardArr[0]에 저장된 Card객체의 주소가 참조변수 c에 저장
        System.out.println(c);   // System.out.println(c.toString());과 같다.
        
        d.shuffle();             // 카드를 섞는다.
        c = d.pick(0);           // 섞은 후에 제일 위의 카드를 뽑는다.
        System.out.println(c); 
    }
}

class Deck {
    final int CARD_NUM = 52;     // 카드의 개수
    Card cardArr[] = new Card[CARD_NUM];  // Card객체 배열을 포함
    
    Deck() {  // 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() {                // Deck에서 카드 하나를 선택한다.
        int index = (int)(Math.random() * CARD_NUM);
        return pick(intdex);
    }
    
    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 SPACE = 4;
    static final int DIAMOND = 3;
    static final int HEART = 2;
    static final int CLOVER = 1;
    int kind;
    int number;
    
    Card() {
        this(SPACE, 1);
    }
    
    Card(int kind, int number) {
        this.kind = kind;
        this.number = number;
    }
    
    public String toString() {  // toString()은 인스턴스의 정보를 문자열로 반환할 목적으로 정의된 것
        String[] kinds = {"", "CLOVER", "HEART", "DIAMOND", "SPACE"};
        String numbers = "0123456789XJQK";
        
        return "kind : " + kinds[this.kind] + ", number : " + numbers.charAt(this.number);
    }
}

toString( )은 모든 클래스의 조상인 Object클래스에 정의된 것으로,
어떤 종류의 객체에 대해서도 toString( ) 호출하는 것이 가능하다.

4. 단일 상속(single inheritance)

  • 자바에서는 단일상속만을 허용한다.

    다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에
    복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만,
    서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다는 단점을 가지고 있다.

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

Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다
다른 클래스로부터 상속을 받는다고 하더라도 상속계층도를 따라 조상클래스, 조상클래스의 조상클래스를 찾아 올라가다 보면 결국 마지막 최상위 조상은 Object클래스일 것이다.

'Language > Java' 카테고리의 다른 글

[Java] 제어자  (0) 2020.01.18
[Java] 다형성(Polymorphism)  (0) 2020.01.18
[Java] 오버로딩과 오버라이딩  (0) 2020.01.17
[Java] 클래스와 객체  (0) 2020.01.15
[Java] 가비지 컬렉션(Garbage Collection)  (0) 2020.01.15