super 키워드
super 키워드는 부모클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는데 사용하는 참조 변수입니다.
인스턴스 변수의 이름과 지역변수의 이름이 같을 경우 인스턴스 변수 앞에 this 키워드를 사용하여 구분할 수 있다.
이와 마찬가지로 부모 클래스의 멤버와 자식클래스의 멤버 이름이 같을 경우 super 키워드를 사용하여 구별할 수 있다.
이렇게 자바에서는 super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있다.
this와 마찬가지로 super 참조 변수를 사용할 수 있는 대상도 인스턴스 메소드 뿐이며,
클래스 메소드에서는 사용할 수 없다.
package package_01;
class Parent{
int a = 10;
}
class Child extends Parent{
void display() {
System.out.println(a); // 10
System.out.println(this.a); // 10
System.out.println(super.a); // 10
}
}
public class TestClass{
public static void main(String args[]) {
Child ch = new Child();
ch.display();
}
}
위의 예제에서 int 형 변수 a 는 부모 클래스인 Parent 클래스에서만 선언되어 있습니다.
따라서 지역변수와 this 참조변수 그리고 super 참조 변수 모두 같은 값을 출력합니다.
package package_01;
class Parent{
int a = 10;
}
class Child extends Parent{
int a = 20;
void display() {
System.out.println(a); // 20 (local variable)
System.out.println(this.a); // 20 (reference variable)
System.out.println(super.a); // 10 (Parent variable)
}
}
public class TestClass{
public static void main(String args[]) {
Child ch = new Child();
ch.display();
}
}
하지만 위의 예제에서 int 형 변수 a 는 자식 클래스인 Child 클래스에서도 선언되어 있습니다.
따라서 지역 변수와 this 참조 변수는 자식클래스에서 대입된 값을 출력하며, super 참조 변수만이
부모 클래스에서 대입된 값을 출력하게 됩니다.
super() 메서드
this() 메서드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면,
super() 메서드는 부모 클래스의 생성자를 호출할 때 사용됩니다.
자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐 아니라 부모 클래스의 모든 멤버까지도 포함되어 있습니다. 따라서 부모 클래스의 멤버를 초기화하기 위해서는 자식 클래스의 생성자에서 부모 클래스의 생성자까지 호출해야만 합니다.
이러한 부모 클래스의 생성자 호출은 모든 클래스의 부모클래스인 Object 클래스의 생성자까지 계속 거슬러 올라가며 수행됩니다.
따라서 자바 컴파일러는 부모 클래스의 생성자를 명시적으로 호출하지 않는 모든 자식 클래스의 생성자 첫줄에 자동으로 다음과 같은 명령문을 추가하여, 부모 클래스의 멤버를 초기화할 수 있도록 해줍니다.
하지만 자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않아야만,
자동으로 기본 생성자를 추가해 줍니다.
만약 다음 예제처럼 부모 클래스에 매개변수를 가지는 생성자를 하나라도 선언했다면,
부모클래스에는 기본 생성자가 자동으로 추가되지 않을 것입니다.
class Parent{
int a;
Parent(int n){
a = n;
}
}
그러나 다음 예제처럼 Parent 클래스를 상속받은 자식 클래스에서 super() 메소드를 사용하여
부모 클래스의 기본 생성자를 호출하게 되면, 오류가 발생하게 될 것입니다.
class Parent{
int a;
Parent(int n){
a = n;
}
}
class Child extends Parent{
int b;
Child(){
super();
b = 20;
}
}
왜냐하면 부모 클래스인 Parent 클래스에는 기본 생성자가 추가되어 잇지 않게 때문이다.
따라서 매개변수를 가지는 생성자를 선언해야 할 경우에는 되도록이면 다음 예제처럼 기본생성자까지
명시적으로 선언하는 것이 좋다.
class Parent{
int a;
Parent(){
a = 10;
}
Parent(int n){
a = n;
}
}
class Child extends Parent{
int b;
Child(){
super();
b = 20;
}
}
다음 예제는 super() 메서드가 어떻게 호출되는지를 보여주는 예제이다.
class Parent{
int a;
Parent() {
a = 10;
}
Parent(int n){
a = n;
}
}
class Child extends Parent{
int b;
Child(){
// super(40); // 40, 0
b = 20; // 10, 20
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class TestClass{
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
'Language > Java' 카테고리의 다른 글
Factory Method Pattern (0) | 2023.04.14 |
---|---|
Singleton Pattern (0) | 2023.04.14 |
Java - Code Sample (0) | 2023.04.13 |
Java - Exception (0) | 2023.03.27 |
Java - Static (0) | 2023.03.27 |