java/객체지향

[객체지향] super와 super()

각시탈코더 2021. 7. 14. 14:39

●참조변수 super

 super는 자손 클래스에서 조상 클래스로부터 상속받을 때, 상속받은 멤버와 자손클래스의 멤버가 같은 경우 구별하기 위해 사용한다. 구별하기위해 사용한다는 점에서 멤버변수와 지역변수를 구별 할 때 사용했던 'this'와 쓰임이 비슷하지만, 참조변수 super는 자손 클래스와 조상 클래스의 멤버를 구별 했다는 점에서 this와 차이가 있다.

 

 

class Ex7_2 {
   public static void main(String args[]) {
       Child c = new Child();
       c.method();
   }
}

class Parent { int x = 10;    /* super.x */ }

class Child extends Parent {
       int x = 20;   // this.x
       
       void method() {
          System.out.println("x=" + x);
          System.out.println("this.x=" + this.x);
          System.out.println("super.x=" + super.x);
       }
}
                                                        결과 : x=20
                                                              this.x=20
                                                              super.x=10

 

 

 

  Child 클래스는 조상 Parent 클래스로부터 x를 상속받았는데 자신의 멤버인 x와 조상의 멤버인 x가 서로 이름이 같아 구별할 수 없다. 이 둘을 구별하기 위해 참조변수 super가 쓰였다.

 

 

●조상의 생성자 super()

 this()처럼 super()도 생성자이다. this()는 같은 클래스의 다른 생성자를 호출하는 반면, super()는 조상의 생성자를 호출하는데 사용한다.

 

 

class Point {
   int x, y;
   
   
   Point(int x, int y) {
       this.x = x;
       this.y = y;
   }
}

class Point3D extends Point {
    int z;
    
    Point3D(int x, int y, int z) {
        this.x = x;    // 조상의 멤버를 초기화	
        this.y = y;    // 조상의 멤버를 초기화			
        this.z = z;
    }
}

 

 

 위의 코드에서는 Point3D클래스의 생성자가 조상인 Point클래스로부터 상속받은 x, y를 초기화한다. 틀린 코드는 아니지만, 아래와 같이 생성자 Point3D()를 조상의 생성자 super()를 사용하면 더 깔끔하고 바람직하다.

 

 

 

Point3D(int x, int y, int z) {
     super(x, y);   // 조상클래스의 생성자 Point(int x, int y)를 호출
     this.z = z;    // 자신의 멤버를 초기화
}

 

 

 

출처: 자바의 정석 기초편(저자: 남궁성, 출판사:도우출판)