상속(Inheritance)?


상속(Inheritance)은 이름에서 그 뜻이 있듯이 기존의 클래스를 물려받아 새로운 클래스를 작성하는 것을 의미합니다.

 

따라서 물려주는 클래스를 부모 클래스, 물려 받아 새롭게 정의되는 클래스는 자식 클래스라고 부르게 됩니다.

 

물론 부모의 부모 클래스(편의상 앞으로 조상 클래스라고 표현하겠습니다!)를 물려 받는 것 또한 가능합니다!

 

그렇다면 왜 상속이 필요한 것일까요?

 

이해하기 쉽게 말씀드리자면, 단순한 코드가 아닌 매우 복잡한 코드를 가진 클래스(들)가 존재한다고 해보겠습니다.

 

그럼 여러분은 이 클래스를 기반으로 앞으로 작업을 해나가려고 합니다. 그런데 이 복잡한 코드를 하나하나 살펴보는 것도

 

쉬운 일이 아닐 뿐더러, 더 중요한 것은 자칫 본인의 생각대로 잘못 코드를 건드렸다가 중대한 에러를 발생시킬 위험 부담도

 

따를 수 있습니다. 이때 손쉽게 여러분만의 새로운 클래스를 만들어 여기에 사용하고자 하는 클래스를 재정의하여 사용하면 이러한

 

상황들을 대비할 수 있을 것입니다!

 

class 자식클래스명 extends 부모클래스명 {

                   중략

}

 

상속 문법은 위의 간단한 예제와 같이 extends 키워드를 통해 부모 클래스를 상속받아 사용하게 됩니다.

 

상속받은 자식 클래스는 부모 클래스의 모든 멤버를 상속받게 되어 사용 가능하게 된다는 특징이 있습니다. (아래 코드 참고!)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Parent1 {
    int a;
    int b;
}
 
class Child1 extends Parent1 {
    int c;
}
 
public class Inheritance {
 
    public static void main(String[] args) {
        
        Child1 C = new Child1();
        System.out.println(C.a);
 
    }
 
}
cs

 

위 코드와 같이 클래스 Child1이 Parent1이라는 클래스를 상속받았으므로 Child1은 자식 클래스, Parent1은 부모 클래스가 됩니다.

 

이때 14행 15행에서 인스턴스를 생성하고 Child1에는 없는 변수 a를 출력하려고 합니다. 그런데 Child1 클래스에는 a라는 변수를 초기화

 

해주지 않았음에도 문제없이 사용이 됩니다. 그 이유는 Parent1의 모든 멤버들을 상속받아 사용 가능하기 때문입니다.

 

따라서 자식 클래스의 멤버 개수는 부모 클래스의 멤버 개수와 항상 같거나 많다는 특징을 알아낼 수 있습니다.


포함(Composite)?


포함(Composite)은 클래스 내에 멤버로써 참조변수를 선언하는 것을 의미합니다.

 

 

1
2
3
4
5
6
7
8
9
10
class Test1 {
    int a;
    int b;
}
 
class Test2 {
    
    Test1 T = new Test1();
    int c;
}
cs

 

8행을 보시면 Test2라는 클래스가 Test1 인스턴스를 생성해 사용하려고 하고 있습니다. 이때 "Test2 클래스가 Test1 클래스를 포함한다"고 

 

합니다. 아래 예제 및 그림을 통해 좀 더 알아보겠습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CompoTest1 {
    int a;
    int b;
}
class CompoTest2 {
    
    CompoTest1 T = new CompoTest1();
    int c;
}
 
public class Inheritance {
 
    public static void main(String[] args) {
        
       CompoTest2 T2 = new CompoTest2();
        System.out.println(T2.T.a);
 
    }
 
}
cs

 

7행에서 인스턴스 생성을 통해 CompoTest1 클래스를 포함하고 있습니다.

 

 

따라서 현재까지의 과정은 참조변수 T를 통해 해당 인스턴스의 주소값을 저장하고, 인스턴스는 변수 a와 변수 b를 가지고 있습니다.

 

 

이번에는 15행부터 16행까지 CompoTest1이 포함된 CompoTest2를 인스턴스화 하였고, CompoTest1의 변수 a를 출력하고자

 

하고 있습니다. 이때 참조변수 T2를 통해 CompoTest2 클래스의 주소값을 저장하고 해당 인스턴스를 가리킵니다. 또 다시 참조 변수

 

T(0x200 부분)를 통해 CompoTest1 클래스의 주소값을 저장하고 해당 인스턴스를 가리키고 있습니다. 따라서 참조변수 T2를 통해

 

CompoTest1 인스턴스의 변수를 출력할 수 있는 것입니다! 따라서 이 과정을 쭉 따라가다 보면 자연스럽게

 

System.out.println(T2.T.a); 과 같은 코드가 되는 것입니다!

 

'java > 객체지향' 카테고리의 다른 글

12. 오버라이딩(overriding)  (0) 2023.01.17
11-1. (보충) 상속  (0) 2023.01.16
10. 멤버 변수 초기화 및 순서  (2) 2023.01.16
9-1. 생성자 this()와 참조변수 this  (0) 2023.01.16
9. 생성자(constructor)  (0) 2023.01.16

+ Recent posts