자바에서는 super(키워드)가 부모, this가 자신을 뜻한다.
this : 자기 자신의 heap 메모리 공간
클래스를 new 하기 전에
나중에 메모리에 뜰 heap 공간을 가리킨다는 말이다.
그럼 new를 하는 시점에
this는 메모리에 뜬 내 heap공간을 가리키게(바인딩) 된다.
super : this와 마찬가지로
클래스를 new하기 전에
나중에 메모리에 뜰 부모의 heap 공간을 가리킨다는(바인딩) 말이다.
+ super는 extends를 했을 때만 사용이 가능하다.
자식을 new할때 상속되어있는 부모도 같이 메모리에 뜨고
부모의 생성자도 실행된다.
부모가 디폴트 생성자가 아닌 매개변수를 받는 생성자일 때 오류가 생긴다.
이때는 생성자 오버로딩을 해줘야 오류가 잡힌다.
실행하면 그냥 디폴트 생성자가 실행되어 출력문이 나오지 않는다.
상속은 부모의 디폴트 생성자를 때리기 때문이다.
왜 그럴까?
자식을 new 하면 자식의 생성자에 super( ) 문장이 생략되어 있기 때문이다.
그래서 이 super( )는 부모의 생성자를 호출하는 것이기 때문에
부모의 디폴트 생성자가 호출되는것이다.
즉, 자식을 new했을 때 부모도 new가 되는 이유인것이다.
내가 직접 super( )를 적고 안에 값을 전달해주면
부모의 디폴트 생성자가 아닌 매개변수를 가진 생성자가 실행되는 것이다.
package ex11;
class 가구 {
String name = "가구";
가구() {
}
가구(int num) {
System.out.println("나 실행되니 ?");
}
}
class 침대 extends 가구 {
String name = "침대";
침대() {
super(1); // super() 이 문장이 항상 생략되어 있음.
//내가 적으면 사라짐.
System.out.println(super.name);
}
}
public class SuperEx01 {
public static void main(String[] args) {
침대 s = new 침대();
}
}
정리
1. super는 부모의 heap공간, this는 자신의 heap공간
메모리에 띄워져 있지 않았을 때
나중에 띄워질 데이터를 가리키는 키워드 2개
단, super는 상속을 했을때만 사용 가능
2. (상속의 관계일 때) 자식을 new 하면 자식의 생성자에 super( ) 문장이 생략되어 있음.
[출처]
https://cafe.naver.com/metacoding
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9