super란? 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다. 멤버변수와 지역변수의 이름이 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버가 이름이 같을 때는 super를 붙여서 구별할 수 있다.
class Example {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
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 이다.
모든 인스턴스 메서드에는 this와 super가 지역변수로 존재하는데, 이 들에는 자신이 속한 인스턴스의 주소가 자동으로 저장된다. 조상의 멤버와 자신의 멤버를 구별하는데 사용된다는 점 빼고는 this와 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) {
super(x, y);
this.z = z;
}
}
위의 경우 Point와 Point3D는 상속관계이나 상속에서 생성자는 상속되지 않기 때문에 super()로 조상의 x, y값을 초기화 해 주고 자신의 z도 초기화 해 준다.