<전제조건>

1
2
3
public class VIPCustomer extends Customer() {
 
}
cs

 

하위 클래스가 생성되는 과정

- 하위 클래스를 생성하면 상위 클래스가 먼저 생성됨

- new VIPCustomer()를 호출하면 Customer()가 먼저 호출됨

 

 

상위 클래스를 호출하는 코드가 없는데, 어떻게 하위 클래스의 생성자는 상위 클래스를 호출할까?

=> 컴파일러가 자동으로 하위 클래스의 생성자에 super(); 를 넣어준다!!

=> super(); 는 상위 클래스의 디폴트 생성자를 호출한다.

=> super.상위클래스에구현된함수 : 이렇게 사용할 수 있다.

===> 즉, super는 상위클래스에 접근할 수 있게 한다. (물론 super 없이 그냥 써도 가능)

 

** 상위 클래스에 디폴트 생성자가 없는 경우(매개변수가 있는 다른 생성자를 선언한 경우)에는 하위 클래스의 생성자도 형태를 맞춰주고 super(매개변수)를 명시적으로 써주어야 한다.

 

 

❗❗super 키워드 정리

- 하위 클래스에서 가지는 상위 클래스에 대한 참조값

- super()는 상위 클래스의 기본 생성자를 호출함

- 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출됨

  (이때 반드시 상위 클래스의 기본 생성자가 존재해야 함)

- 상위 클래스의 기본 생성자가 없는경우(다른 생성자가 있는 경우) 하위 클래스 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출해야 함

- super는 생성된 상위 클래스 인스턴스의 참조값을 가지므로 super를 이용하여 상위 클래스의 매서드나 멤버변수에 접근할 수 있음

 

 

상속에서 인스턴스 메모리의 상태

- private 변수도 메모리에 생성되며, 접근을 못하는것 뿐이다. -> 지난번 예제에서 접근할 수 있게 protected로 변경함.

힙 메모리

 

형 변환(업캐스팅)

- 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성

- 하위 클래스는 상위 클래스를 내포하고 있기 때문에 가능(위 메모리 상태 참고)

1
Customer customerLee = new VIPCustomer();
cs

- 상위 클래스 타입의 변수에 하위 클래스 변수가 대입

1
2
3
4
5
VIPCustomer vCustomer = new VIPCustomer();
addCustomer(vCustomer);
int addCustomer(Customer customer) {
 
}
cs

- 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능함

- 상속관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 됨 (그 역은 성립하지 않음❌)

 

형 변환과 메모리

- Customer vc = new VIPCustomer(); 에서 vc가 가리키는 것은?

- VIPCustomer()생성자에 의해 VIPCustomer 클래스의 모든 멤버변수에 대한 메모리는 생성됐지만, 변수의 타입이 Customer 이므로 실제 접근 가능한 변수나 매서드는 Customer의 변수와 매서드이다.

 

클래스의 계층구조가 여러 단계일 수 있다!

 

출처 : 패스트캠퍼스

+ Recent posts