하위 클래스 생성 과정
- 하위 클래스가 생성되면 상위 클래스가 먼저 생성된다.
- VIPCustomer 생성자가 먼저 Customer 생성자를 호출한다.
Customer 생성자
public Customer() {
customerGrade = "SILVER";
bonusRatio = 0.01;
System.out.println("Customer() call"); // Customer 생성자 호출 시 출력 메세지
}
VIPCustomer 생성자
public VIPCustomer() {
bonusRatio = 0.05;
saleRatio = 0.1;
customerGrade = "VIP";
System.out.println("VIPCustomer() call"); // VIPCustomer 생성자 호출 시 출력 메세지
}
VIPCustomer 객체 생성 부
VIPCustomer customerKim = new VIPCustomer();
customerKim.setCustomerName("김유신");
customerKim.setCustomerId(1001);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
수행 결과
Customer 생성자가 먼저 생성된 것을 확인할 수 있다.
Customer() call
VIPCustomer() call
김유신님의 등급은 VIP이며, 보너스 포인트는 10000입니다.
Super 키워드
VIPCustomer 생성자에 Customer 생성자를 호출하는 코드가 없는데 어떻게 호출되는 것일까?
- super는 this와 비슷한 개념
- 하위 클래스가 상위 클래스의 인스턴스의 참조값을 가지도록 해주기 때문에 멤버변수나 메서드에 접근 가능
- 또한 상위 클래스의 default 생성자를 호출해준다.
- 상위 클래스의 default 생성자 호출이 가능하다면 컴파일러가 자동으로 super()를 넣어준다.
- default 생성자는 상위, 하위 클래스 모두 생성자가 없거나, 하위 클래스에서 명시적으로 생성자를 호출하지 않을 때 호출된다.
- 만약 상위 클래스에 매개 변수가 있는 생성자만 있다면 하위 클래스의 생성자에서 오류가 발생한다.
- 이럴땐 하위 클래스의 생성자에서도 매개 변수를 받아 super 키워드를 통해 상위 클래스에 전달해주거나, 하위 클래스에 명시적으로 super에 값을 넣어준다.
Customer.java
public Customer(String customerName, int customerId) { // 매개 변수가 있는 constructor
this.customerName = customerName;
this.customerId = customerId;
customerGrade = "SILVER";
bonusRatio = 0.01;
}
VIPCustomer.java
public VIPCustomer(String customerName, int customerId) { // 매개변수 받음
super(customerName, customerId); // Customer 생성자 명시적으로 호출
bonusRatio = 0.05;
saleRatio = 0.1;
customerGrade = "VIP";
}
CustomerTest.java
Customer customerLee = new Customer("이순신",1000);
customerLee.bonusPoint = 1000;
System.out.println(customerLee.showCustomerInfo());
VIPCustomer customerKim = new VIPCustomer("김유신",10000);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
상속에서 인스턴스 메모리 상태
- 상위 클래스의 인스턴스 먼저 생성되고, 하위 클래스의 인스턴스가 생성된다.
- 하위 클래스에서도 상위 클래스의 private 변수들도 생성되지만 접근은 하지 못한다.

형변환 (업 캐스팅)
- 상위 클래스 타입으로 변수를 선언하고 하위 클래스의 생성자로 생성할 수 있다.
- customer는 VIPCustomer 생성자에 의해 모든 VIPCustomer 클래스의 멤버 변수에 대한 메모리는 생성되었지만, 타입이 Customer이기 때문에 Customer 클래스의 멤버 변수와 메서드에만 접근할 수 있다.
Customer customer = new VIPCustomer();
- 상위 클래스 타입의 변수에 하위 클래스 타입의 변수를 대입할 수 있다.
VIPCustomer vCustomer = new VIPCustomer;
addCustomer(vCustomer);
int addCustomer(Customer customer) {
}
- 하위 클래스는 상위 클래스를 내포하고 있으므로 상위 클래스로의 묵시적 형변환이 가능하다.
- 역은 성립하지 않는다.
'Java' 카테고리의 다른 글
| [Java 객체지향] 오버라이딩 (메서드 재정의) (0) | 2022.01.30 |
|---|---|
| [Java 객체지향] 상속 활용 (멤버십 클래스 구현) (0) | 2022.01.30 |
| [Java 객체지향] 상속 (0) | 2022.01.30 |