super & super()
1. super
super는 자식 클래스가 부모 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조 변수입니다. 클래스 내의 멤버변수와 지역변수의 이름이 같을 경우 구분을 위해 this를 사용하듯이 부모 클래스와 자식 클래스의 멤버의 이름이 같을 경우 super를 사용합니다. this와 super는 인스턴스의 주소값을 저장하는데 static 메서드(클래스 메서드)와는 무관하게 사용됩니다.
다음 예제 코드를 통해 super에 대해 확인해보겠습니다.
class JavaApp { public static void main(String[] args) { Child child = new Child(); child.childMethod(); } } class Parent { int x = 10; } class Child extends Parent { int x = 20; void childMethod() { 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
2. super()
super()는 부모 클래스의 생성자를 호출하는 메서드입니다. 상속받은 자식 클래스가 부모 클래스의 멤버를 사용할 경우가 있을 수도 있으므로 부모 클래스를 우선적으로 초기화해줘야 합니다. 부모 클래스의 생성자는 자식 클래스의 생성자 첫줄에서 호출해줍니다. 이러한 부모 클래스에 대한 생성자 호출은 상속관계에 따라 Object 클래스까지 올라가서 마무리됩니다.
정리하면, Object 클래스를 제외한 모든 클래스의 생성자의 첫줄에는 반드시 자신의 클래스의 또다른 생성자, this() 또는 부모 클래스의 생성자, super()를 호출해줘야 합니다. 이렇게 하지 않으면 컴파일러가 자동으로 super()를 생성자의 첫줄에 호출합니다.
다음 예제 코드를 통해 super()에 대해 확인해보겠습니다.
class JavaApp { public static void main(String[] args) { Point3D point3d = new Point3D(); // Point3D() 생성자로 초기화 및 인스턴스 생성 System.out.println("point3d.x=" + point3d.x); System.out.println("point3d.y=" + point3d.y); System.out.println("point3d.z=" + point3d.z); } } class Point { int x = 10; int y = 20; Point(int x, int y) { // 생성자의 첫줄에 다른 생성자를 호출하지 않았기 때문에, // 컴파일러가 이 부분에 super()를 호출합니다. // 부모 클래스이므로 Object 클래스의 super()가 호출됩니다. this.x = x; this.y = y; } } class Point3D extends Point { int z = 30; Point3D() { this(100, 200, 300); // 자신의 클래스의 또다른 생성자 호출 } Point3D(int x, int y, int z) { super(x, y); // 부모 클래스 생성자 호출 this.z = z; } }
위의 예제 실행시 다음의 결과가 출력됩니다.
point3d.x=100
point3d.y=200 point3d.z=300
이상으로 자바의 super와 super()에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 3rd Edition』, 도우출판(2016), p330. Chapter 07 객체지향 프로그래밍 II