Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

codingfarm

super 본문

Programming Language/JAVA

super

scarecrow1992 2021. 1. 7. 21:30

super는 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조 변수이다.

멤버변수와 지역변수의 이름이 같을때 this로 구별하듯이, 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 사용해서 구별할 수 있다.

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
package project_1;
 
class Parent{
    int x = 10;
    void Method() {
        System.out.println(x);
    }
}
 
class Child extends Parent{
    int x = 20;
    void Method() {
        System.out.println(x);
        System.out.println(super.x);
    }    
}
 
 
public class Hello {
    public static void main(String[] args) {
        Parent p = new Parent();
        Child c = new Child();
        Parent i = new Child();    
        
        p.Method();
        c.Method();
        i.Method();        
    }    
}
 
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
class Parent{
    int x = 10;
}
 
class Child extends Parent{
    int x = 20;
}
 
class GrandChild extends Child{
    int x = 30;
    void Method() {
        System.out.println(x);
        System.out.println(super.x);        
    }
    
}
 
public class Hello {
    public static void main(String[] args) {
        GrandChild object = new GrandChild();
        object.Method();
    }    
}
 
cs

상속관계가 여러차례로 이루어지더라도 super를 통해 접근하는 클래스는 직접 상속받는 클래스이다.

 

 


super() - 조상 클래스의 생성자

이와같은 조상 클래스 생성자의 호출은 클래스의 상소관계를 거슬러 올라가면서 계속 반복되다가, 마지막으로 모든 클래스의 최고 조상인 Object 클래스의 생성자인 Object() 까지 가서야 끝이난다.

Object 클래스를 제외한 모든 클래스의 생성자는 첫줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야한다. 그렇지 않으면 컴파일러는 생성자의 첫 줄에 super();를 자동적으로 추가할 것이다.
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
class Class0{
    Class0(){
        System.out.println("Class0's Constructor");
    }    
}
 
class Class1 extends Class0{
    Class1(){
        System.out.println("Class1's Constructor");
    }    
}
 
class Class2 extends Class1{
    Class2(){
        System.out.println("Class2's Constructor");
    }        
    
}
 
class Class3 extends Class2{
    Class3(){
        System.out.println("Class3's Constructor");
    }    
}
 
public class Hello {
    public static void main(String[] args) {
        Class3 object = new Class3();
    }    
}
cs

각 생성자내에 별도로 super(); 구문이 없더라도 상위클래스의 생성자를 호출하고 있음을 볼 수 있다.

 

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 Class0{
    Class0(){
        System.out.println("Class0's Constructor");
    }    
}
 
class Class1 extends Class0{
    Class1(){
        System.out.println("Class1's Constructor");
    }    
}
 
class Class2 extends Class1{
    Class2(){
        System.out.println("Class2's Constructor");
    }        
    
    Class2(int a, int b){
        System.out.println("Class2's Constructor");
        System.out.println("a : " + a + ", b : " + b);
    }    
}
 
class Class3 extends Class2{
    Class3(){
        super(2,5);
        System.out.println("Class3's Constructor");
    }    
}
 
public class Hello {
    public static void main(String[] args) {
        Class3 object = new Class3();
    }    
}
cs

위처럼 super 생성자를 직접 명시하여 호출하는것도 가능하다.

'Programming Language > JAVA' 카테고리의 다른 글

다형성(polymorphism)  (0) 2021.03.10
제어자(modifier)  (0) 2021.03.07
오버라이딩(overriding)  (0) 2021.01.07
상속(inheritance)  (0) 2021.01.07
변수  (0) 2020.11.02
Comments