[Java] Super

Super



 

상속받은 멤버를 참조하는데 사용되는 참조변수

 



this VS super


멤버 변수와 지역변수의 이름이 같을 때 this를 사용해서 구별한다.

상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때 super로 구별한다.

 


조상클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다.

그러나,

조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야하는 경우에만 super를 사용하는 것이 좋다.

 

static메서드(클래스 메서드)는 인스턴스와 관련이 없다.

그래서 this와 마찬가지로 super역시 static메서드에서는 사용할 수 없고, 인스턴스 메서드에서만 사용할 수 있다.





조상 클래스, 자손 클래스에서 멤버변수명을 중복해서 정의하는 것이 가능하다.

참조변수 super를 이용해서 서로 구별한다.


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;

 

 

 super.

 조상 클래스로부터 상속받은 멤버변수 x

 this.

 자손 클래스에 선언된 멤버변수 x


 

 



메서드 역시 호출할 수 있다.

 

특히!

조상 클래스의 메서드를 자손 클래스에서 오버라이딩한 경우에 super를 사용한다.

 

 



super() this()처럼 생성자이다.

 

this()의 경우에는 같은 클래스의 다른 생성자를 호출하는데 사용

super()는 조상 클래스의 생성자를 호출하는데 사용

 

 

조상클래스 멤버의 생성과 초기화 작업이 수행되어야 하기 때문에 자손 클래스의 생성자에서 조상 클래스의 생성자가 호출되어야 한다.

생성자의 첫 줄에서 조상 클래스의 생성자를 호출해야 하는 이유는

자손 클래스의 멤버가 조상클래스의 멤버를 사용할 수도 있으므로 조상 멤버들이 먼저 초기화되어 있어야 하기 때문이다.

 

Object클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자 또는 조상의 생성자를 호출해야 한다.

그렇지 않으면 컴파일러는 생성자의 첫 줄에 ' super() ; '를 자동적으로 추가할 것이다.

 

인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요한 일이다.

 

1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

2. 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?