백엔드/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의 변수를 호출해주었다.

 

 

 

*왜 상속받은 클래스는 부모클래스의 생성자를 호출해 주어야할까?*

부모클래스에게 상속받은 자식클래스는 부모의 멤버를 사용하려면

사용할 메모리를 할당 받아야 하는데 이를 부모 생성자를

자식클래스에서 선언함으로써 해결하는 것으로 볼 수 있다.