자바 (ref. 자바의정석)

상속(inheritance) - JAVA

쿠쿠s 2022. 2. 16. 12:03

 

 

상속이란?

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것입니다. 상속이라는 말 그대로 누군가에게 자신의 것을 물려주는 것을 의미합니다. 상속을 통해서 클래스를 작성하면 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하며, 적은 양으로 코드로 작성이 가능해집니다.

이러한 특징은 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여를 합니다.

 

 

 

상속의 사용 방법 - 'extends'

ex) class 자식클래스명 extend 부모클래스명 { . . . }   , class A extend B { . . . }

 

 

두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 부모클래스 상속받는 클래스를 자식 클래스라고 합니다. 위에서 말씀드린 것처럼 코드를 공유하기 때문에 부모 클래스에 멤버변수를 추가하면 자식 클래스에 자동적으로 해당 멤버변수가 추가된 것처럼 사용이 가능하고, 반대로 자식 클래스에 멤버변수나 메서드를 추가해도 부모클래스는 영향을 받지 않습니다. 그래서 상속을 부모 클래스를 확장(extend)한다라는 의미로도 해석이 가능합니다.

 

 

public class Parent {
    int year;
}

class Child extends Parent {
    int age;
}

class Inheritance{

    public static void main(String[] args) {
        Parent p = new Parent();
        Child c = new Child();
        
        c.year = 2022;
        c.age = 29;
        
        p.year = 2022;
        p.age = 20; //에러!!
    }
}

- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.

- 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

 

 

 

 

 

또 다른 예시를 들어보겠습니다. 아래와 같이 상속관계를 만들 수 있습니다.

class Parent {
    int year;
    void play() { }
}

class Child extends Parent {
    int age;
}

class School {
    void play() { }
}

class Child2 extends Parent , School { //에러 다중상속 불가
    int height;
}

class GrandChild extends Child { //Child 상속
    int weight;
}

class Inheritance{

    public static void main(String[] args) {
        GrandChild gc = new GrandChild();

        gc.year = 2022;
        gc.age = 10;
        gc.weight = 70;
        gc.height = 180; //에러!! 상속관계가 아님
    }
}

 

 

 

GrandChild는 Child 클래스를 상속받는데 그 부모인 Parent 클래스로부터 상속받은 멤버까지 상속받게 된다.

GrandChild는 Child의 자식이자 Parent의 자식이 된다.  그래서 최고 부모인 Parent 클래스를 변경하게 된다면 하위 자식들에게 영향을 미쳐 공통적인 부분은 부모클래스에서 관리하고 자식 클래스는 자신의 정의된 멤버들만 관리하게 된다.

 

 

그리고 자바에서는 단일 상속만 허용하기 때문에 두 클래스로부터 상속을 받을 수 없다. 위 코드처럼 Child2 클래스는 Parent 와 School 클래스를 상속받는다고 가정했을 때 부모 타입에 play ( ) 라는 메서드가 공통으로 존재하게 됩니다. 이렇게 된다면 어느 부모클래스의 메서드를 상속받게 되는지 구분을 할 수가 없습니다.

 

자바에서는 이러한 문제점을 해결하기 위해 다중상속의 장점도 있긴 하지만 포기하고, 단일 상속만을 허용합니다. 그래서 클래스 간의 관계가 보다 명확하고 코드를 더욱 신뢰할 수 있게 만들어 줍니다.

 

 

 

요약하면

  • 상속방법 : class 자식클래스 extend 부모클래스
  • 생성자와 초기화 블럭은 상속되지 않는다. 메서드와 멤버변수 상속된다.
  • 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.
  • 다중 상속이 불가능하다.
  • 코드를 부모클래스가 공통관리 하여 객체지향적인 개발이 가능하다.