[JAVA] 자바 클래스 상속에 대해

    728x90

    안녕하세요

    로로봉입니다 : )

    오늘은 자바에서 클래스 상속에 대해 알아보도록 하겠습니다.

    클래스의 상속은 부모 클래스의 멤버를 내려받아 자식 클래스 내부에 포함시키는 것을 말합니다.


    1) 상속의 개념

    상속을 이해하기 위해 예를 들어보겠습니다.

    아래와 같이 '어린이'와 '어른' 클래스가 있다고 가정합니다.

    '어린이'클래스에는 '이름', '나이', '키', '학년' 4가지 필드와 '먹기()', '잠자기()', '공부하기()'라는 메서드가 있다고 가정하고,

    '어른'클래스에는 '이름', '나이', '키', '직업' 4가지 필드와 '먹기()', '잠자기()', '일하기()'라는 메서드가 있다고 가정합니다.

    사람이라면 누구나 이름과 나이, 키가 있고, 먹고 자야하므로 두 클래스 모두 이름 필드와 나이 필드 키 필드, 먹기, 잠자기 메서드를 공통으로 포함하고 있습니다.

    [ 그림 1 : 중복된 필드와 메서드를 포함하고 있는 클래스 ]

    학년 필드와 공부하기() 메서드를 추가한 것이 어린이 클래스가 되고, 직업 필드와 일하기() 메서드를 추가한 것이 어른 클래스가 됩니다.

    [ 그림 2 : 사람 클래스를 상속받은 클래스 ]

    해당 내용을 상속으로 표현하면 사람 클래스가 부모 클래스가 되고, 어린이와 어른 클래스가 자식 클래스가 됩니다.

    두 자식 클래스는 부모의 모든 멤버를 내려받기 때문에 클래스 내에서 추가되는 필드와 메서드만 구성하면 됩니다.

    반대로 생각하면 부모 클래스는 자식 클래스들의 공통적인 특징을 모아 구성한 클래스라고 생각하시면 됩니다.


    2) 상속의 장점

    상속의 장점으로는 코드의 중복성이 제거되는 장점이 있습니다. 클래스들의 공통되는 부분을 부모 클래스에 한 번만 정의하여 코드가 간결해 지는 것입니다.

    두 번째 장점은 클래스의 다형적 표현이 가능하다는 점입니다. 다형적이라는 것은 기준이 되는 부모 클래스를 만들어 상속시키면 특징적인 부분만 추가하여 여러가지 형태가 다양한 표현을 할 수 있다는 뜻입니다.


    3) 상속 문법

    클래스를 상속할 때는 extends 키워드를 사용하며, 클래스명 다음에 extends 부모 클래스를 표기합니다.

    class 자식 클래스 extends 부모 클래스 {
       ...
    }

    자바에서는 반드시 부모 클래스는 1개만 상속할 수 있습니다.  이것을 다중 상속이 불가하다고 표현합니다.

    자식 클래스는 몇개가 되든 상관 없으나, 부모 클래스는 반드시 1개만 상속시킬 수 있습니다.

    이제 위에서 표현했던 사람과 어린이, 어른 클래스에 대해 코드로 표현해 보도록 하겠습니다.

    [ 그림 3 : 사람 클래스에 대한 상속 클래스 소스 코드 ]

    위와 같이 Children 클래스와 Adult 클래스가 모두 Human 클래스를 부모 클래스로 상속 받기 때문에 두 클래스의 객체는 부모 클래스에 있는 멤버를 모두 사용할 수 있게 되는 것입니다.


    4) 상속할 때의 메모리 구조

    위에서 상속받은 자식 클래스는 부모 클래스의 모든 멤버를 내려받는다고 했습니다.

    어떻게 이것이 가능한지 메모리 구조를 살펴보도록 하겠습니다.

    class A {
       int m;
       void abc() {...}
    }
    
    class B extends A {
       int n;
       void bcd() {...}
    }

    클래스 A는 필드 m과 메서드 abc()를 포함하고 있고, 클래스 B는 클래스 A를 상속하고, 필드 n과 메서드 bcd()를 추가로 정의했습니다.

    자식 클래스 B의 객체를 생성했을 때 메모리 구조를 알아보겠습니다.

    B b = new B();

    [ 그림 4 : 상속할 때 메모리 구조 ]

    클래스 영역에는 선언된 자료형의 클래스와 그 부모 클래스가 모두 로딩됩니다.

    이때 참조 변수 b는 B클래스 자료형으로 선언됐기 때문에 힙 메모리에 있는 B타입 객체만을 가리킬 수 있습니다.

    자바 가상 머신은 자식 클래스의 객체를 생성할 때 가장 먼저 부모 클래스의 객체를 생성합니다.

    이후 자식 클래스에서 추가한 필드와 메서드가 객체에 추가됨으로써 클래스 B의 전체 객체가 완성되는 것입니다.

    자식 클래스 객체의 내부에는 부모 클래스 객체가 포함되있으므로 자식 클래스 객체에서 부모 클래스의 멤버를 사용할 수 있게 됩니다.

    위 그림과 같이 자바 가상 머신이 부모 클래스의 멤버(필드, 메서드)를 자식 클래스 객체에 자동으로 먼저 생성해준다고 보면 됩니다.


    5) 생성자의 상속 여부

    상속을 하면 부모 클래스의 필드, 메서드, 이너 클래스를 내려받습니다. 생성자는 절대 상속되지 않습니다.

    그 이유는 생성자가 상속 되는 경우 리턴 타입이 없는 부모 클래스의 생성자가 상속되는 것이기 때문에 오류가 발생하게 됩니다.

     

    공감 ♥ + 구독부탁드립니다 : )

    728x90
    반응형

    댓글