반응형
하위 클래스가 생성 되는 과정
하위 클래스를 생성하면 상위 클래스가 먼저 생성 됨
new VIPCustomer()를 호출하면 Customer()가 먼저 호출 됨 (기본적으로 default 생성자를 호출: super())
클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출 함
super 키워드
- 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
- super()는 상위 클래스의 기본 생성자를 호출 함
- 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출 됨
- (이때 반드시 상위 클래스의 기본 생성자가 존재 해야 함)
- 상위 클래스의 기본 생성자가 없는 경우 (다른 생성자가 있는 경우) 하위 클래스에서 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출 함
- super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메소드나 멤버변수에 접근 할 수 있음
package ch26;
public class Customer {
// 상속받을 클래스에서 사용하기 위해 protected로 지정
protected int customerID;
protected String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
// public Customer() {
//
// customerGrade = "Silver";
// bonusRatio = 0.01;
// System.out.println("Customer() call");
// }
// 디폴트 생성자 없애고 매개변수가 있는 생성자 추가
public Customer(int CustomerID, String customerName) {
this.customerID = customerID;
this.customerName = customerName;
customerGrade = "Silver";
bonusRatio = 0.01;
System.out.println("Customer(int, String) call");
}
public int clacPrice(int price) {
bonusPoint += price * bonusRatio;
return price;
}
public String showCustomerInfo() {
return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
}
public int getCustomerID() {
return customerID;
}
public void setCustomerID(int customerID) {
this.customerID = customerID;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerGrade() {
return customerGrade;
}
public void setCustomerGrade(String customerGrade) {
this.customerGrade = customerGrade;
}
}
package ch26;
public class VIPCustomer extends Customer {
double saleRatio;
private String agentID;
// public VIPCustomer() {
// bonusRatio = 0.05;
// saleRatio = 0.1;
// customerGrade = "VIP";
// System.out.println("VIPCustomer() call");
// }
// 보통 상위클래스 생성자 형태와 맞춰서 생성
public VIPCustomer(int CustomerID, String customerName) {
super(CustomerID, customerName);
customerGrade = "VIP";
bonusRatio = 0.05;
saleRatio = 0.1;
System.out.println("VIPCustomer(int, String) call");
}
public String getAgentID() {
return agentID;
}
public void setAgentID(String agentID) {
this.agentID = agentID;
}
}
package ch26;
public class CustomerTest {
public static void main(String[] args) {
Customer customerLee = new Customer(10010, "이순신");
customerLee.bonusPoint = 1000;
System.out.println(customerLee.showCustomerInfo());
VIPCustomer customerKim = new VIPCustomer(10020, "김유신");
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
}
}
상속에서 인스턴스 메모리의 상태
항상 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성 됨
형 변환(업캐스팅)
상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성
Customer customerK = new VIPCustomer(100, null);
상위 클래스 타입의 변수에 하위 클래스 변수가 대입
하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능함
상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업 캐스팅)이 됨 (그 역은 성립하지 않음)
반응형
'언어 > JAVA' 카테고리의 다른 글
메서드 재정의, 가상 메서드 원리 (0) | 2021.04.18 |
---|---|
메서드 재정의(overriding) (0) | 2021.04.18 |
객체 간 상속의 의미 (0) | 2021.04.17 |
ArrayList를 활용한 간단한 성적 산출 프로그램 (0) | 2021.04.17 |
ArrayList (0) | 2021.04.16 |