백엔드/Java
상속과 생성자 (extends and constructor)
JP59
2021. 3. 5. 16:57
상속받은 자식 클래스는 생성자 작업시에 반드시 부모 클래스를 호출해줘야 한다.
생성자를 따로 만들어주지 않으면 컴파일 시에 자동으로 묵시적 생성자를 생성해주는 것 처럼
상속 시 부모 클래스의 생성자도 묵시적 생성자로 되어 있으면 자동으로 선언된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class grandmother{
String gm;
}
class mother extends grandmother{
String m;
}
class child extends mother{
String c;
}
|
cs |
tod
grandmother부터 child까지 3개의 클래스가 서로 상속을 주고 받았지만
따로 생성자를 만들어주지 않는 이유는 컴파일을 하면서 이미 묵시적 생성자를
선언해 주었기 때문이다. 생략부분을 직접 나타내보면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class grandmother{
String gm;
grandmother(){ } }
class mother extends grandmother{
String m;
mother(){ super(); } }
class child extends mother{
String c;
child(){ super(); } }
|
cs |
만약 컴파일 시 자동으로 생성되는 묵시적 생성자 이외의 개발자가 지정한
명시적 생성자를 만들면 어떻게 해야 할까? 다음 코드를 보면 알 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
class grandmother{
String gm;
grandmother(String gm){
this.gm=gm;
}
}
class mother extends grandmother{
String m;
mother(String gm, String m){
super(gm);
this.m=m;
}
}
class child extends mother{
String c;
child(String gm, String m, String c){
super(gm,m);
this.c=c;
}
}
|
cs |
grandmother에서 생성자를 따로 선언해주었다.
grandmother를 상속받은 mother 클래스는 부모클래스가 명시적 생성자이므로
명시적 생성자를 선언한 생성자를 선언할지 부모클래스에 묵시적 생성자를 만들어
묵시적 생성자를 선언할지 선택할 수 있는데 위 코드에서는 명시적 생성자를 따라갔다.
super 명령문으로 부모클래스의 변수를 호출해주었다.
마찬가지로 child클래스는 grandmother클래스를 상속받은 mother클래스를 상속받았으므로
super에 gm,m의 변수를 호출해주었다.
*왜 상속받은 클래스는 부모클래스의 생성자를 호출해 주어야할까?*
부모클래스에게 상속받은 자식클래스는 부모의 멤버를 사용하려면
사용할 메모리를 할당 받아야 하는데 이를 부모 생성자를
자식클래스에서 선언함으로써 해결하는 것으로 볼 수 있다.