super
super는 부모 클래스로부터 상속받은 필드나 메서드를 자식 클래스에서 참조하는데 사용하는 변수다.
조금 정리해서 말하자면 자신이 상속받은 부모를 가리키는 참조 변수인 것
this의 경우 필드, 매개변수명이 동일해서 구분하기 위해 사용했다.
super는 부모 클래스의 멤버와 자식 클래스의 멤버 명이 같을 경우 사용하여 구별할 수 있다.
이런 식으로 super 참조 변수는 부모 클래스의 멤버에 접근할 수 있게 된다.
아래 예제를 주석과 함께 살펴보자
class Parent { int a = 10; } // Parent 클래스에서 a = 10 선언
class Child extends Parent { // Child 클래스에서 Parent 클래스 상속 -> a = 10을 가져옴
int a = 20; // 다시 a = 20 초기화
void isPrint() {
System.out.println(a); // 출력 a
System.out.println(super.a); // 출력 super.a
}
}
public class SuperEX {
public static void main(String[] args) {
Child child = new Child();
child.isPrint();
}
}
출력 결과는 아래와 같다.
20
10
즉, super 참조 변수는 부모 클래스에서 대입된 값을 출력하는 것을 볼 수 있다.
super()
super()는 자식 클래스에서 객체 생성을 한다면 부모 클래스의 모든 멤버도 포함되어 있기 때문에 부모 클래스 또한 초기화를 해줘야 한다.
그래서 자식클래스의 생성자에서 부모 클래스의 생성자까지 호출해야 한다.
따라서 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫 줄에 자동으로 호출하게 된다.
하지만 this처럼 매개변수를 가지는 생성자(오버로딩)가 있다면 자동으로 추가되지 않는다.
그래서 부모 클래스에 기본 생성자를 선언하거나, 오버로딩된 생성자에 맞춰서 super()의 인자를 추가해주어야 한다.
class Parent {
int a;
Parent() { a = 1; } // 1. 기본 생성자를 추가하거나
Parent(int num) { a = num; }
}
class Child extends Parent {
Child() {
super();
super(2); // 2. 인자를 추가하거나
}
}