[Java] 객체지향 프로그래밍(oop) - super : 참조변수 & super() : 조상의 생성자

SolChan Kim·2023년 12월 12일

📖super : 참조변수

this

  • 인스턴스 자신을 가리키는 참조변수

  • 인스턴스의 메모리 주소가 저장되어있다.

  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

super

  • 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데
    사용되는 참조변수다.

  • 조상의 멤버와 자신의 멤버를 구별하는데 사용한다.

  • super와 this는 조상의 멤버와 자신의 멤버를 구별하기 위해서
    사용된다는 것을 제외하고는 근본적으로 같다.

  • super도 this처럼 인스턴스메서드 내에 지역변수로 숨겨진 채로
    존재하고 super에도 인스턴스의 주소가 저장되어 있다.

public class Parent {
	int x = 20;
}

public class Child extends Parent {
	int x = 10;
	
	public void method() {
		System.out.println("x : " + x);
		System.out.println("this.x : " + this.x);
		System.out.println("super.x : " + super.x);
	}
	public static void main(String[] args) {
		Child child01 = new Child();
		
		child01.method();
	}
}

// result
x : 10
this.x : 10
super.x : 20

Parent클래스와 Parent클래스를 상속받는 Child클래스가 있다.
Parent와 Child에 똑같이 멤버변수 x가 선언되어 있다.

이처럼 조상의 멤버변수와 같은 이름의 변수를 자손의 멤버변수로
중복해서 선언하는 것이 가능하다.

인스턴스가 생성되면 각각 별도의 저장공간을 차지하게 된다.
-> 이름은 같아도 서로 다른 변수

이 둘을 구별하기 위해서는 참조변수 super를 사용해야 한다.

super를 붙이지 않으면 Child클래스의 멤버변수 x를 의미하게 된다.

Child타입의 인스턴스를 생성한 다음, method()를 호출한 결과는 아래와 같다.

x : Child클래스의 멤버변수 x를 의미(10)
this.x : Child클래스의 멤버변수 x를 의미(10)
super.x : 조상인 Parent로 부터 상속받은 멤버변수 x를 의미(20)

public class Parent {
	int x = 20;
}

public class Child extends Parent {
	
	public void method() {
		System.out.println("x : " + x);
		System.out.println("this.x : " + this.x);
		System.out.println("super.x : " + super.x);
	}
	public static void main(String[] args) {
		Child child01 = new Child();
		
		child01.method();
	}
}

// result
x : 20
this.x : 20
super.x : 20

Child클래스에 멤버변수 x가 없는 경우에는 어떻게 되는 걸까?

Child클래스의 인스턴스를 생성해서 method를 호출하면 변수 x가
하나밖에 없기 때문에 결과는 아래와 같다.

x : 조상으로부터 상속받은 멤버변수 x를 의미(20)
this.x : 상속받은 멤버변수 x를 의미(20)
super.x : 조상의 멤버변수 x를 의미(20)

자신의 멤버가 조상의 멤버와 중복되지 않기 때문에 super를 사용할 필요가 없다.
-> 상속받은 멤버도 자신의 멤버이므로 this를 사용하는 것만으로도 충분하다.


📖super() : 조상의 생성자

  • 자손클래스의 인스턴스를 생성하면,
    자손의 멤버와 조상의 멤버가 합쳐진 인스턴스가 생성된다.

  • 조상의 멤버들도 초기화되어야 하기 때문에
    자손의 생성자의 첫 문장에서 조상의 생성자를 호출한다.

Point클래스를 컴파일 하면 오른쪽과 같이 변경된다.

Point클래스의 생성자 중에서 두 개의 매개변수를 입력받는
생성자의 첫줄에 생성자 super();를 호출하는 코드가 자동으로 추가되었다.

Point클래스는 Object클래스를 자동으로 상속받고 있기 때문에,
생성자 super()는 Object클래스의 생성자를 의미한다.

Point클래스의 기본생성자는 첫번째 줄에서
다른 생성자를 호출하고 있기 때문에
조상생성자를 호출하는 코드가 추가되지 않았다.
-> 호출한 다른 생성자에서 조상의 생성자가 호출될 것이기 때문이다.

0개의 댓글