<전제조건>
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의 변수와 매서드이다.
클래스의 계층구조가 여러 단계일 수 있다!
출처 : 패스트캠퍼스
'Java' 카테고리의 다른 글
[Java기본] 다형성 (0) | 2021.05.03 |
---|---|
[Java기본] 상속3-매서드 재정의(overriding), 가상 매서드(virtual method) (0) | 2021.05.03 |
[Java기본] 상속1 - 문법과 사용예제 (0) | 2021.04.29 |
[Java기본] ArrayList-객체배열 (0) | 2021.04.28 |
[Java기본] Array - 배열에 대하여 (0) | 2021.04.27 |