상속에서 클래스 생성 과정과 형 변환
하위클래스가 생성되는 과정
하위클래스가 생성될 때 상위 클래스가 먼저 생성된다.
상위클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출된다.
하위 클래스의 생성자에서는 무조건 상위 클래스의 생성자가 호출되어야 한다.
하위 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super() 를 추가한다.
Super() 로 호출되는 생성자는 상위클래스의 기본생성자 이다.
만약 상위클래스의 기본생성자가 없는 경우 ( 매개변수가 있는 생성자만 존재 하는 경우 )
하위 클래스는 명시적으로 상위클래스의 생성자를 호출해야 한다.
Customer 클래스
package inheritance;
import org.omg.Messaging.SyncScopeHelper;
public class Customer {
private int customerID;
private String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
/*
public Customer() { // 주로 생성자 에서 초기화를 한다.
customerGrade = "SILVER";
bonusPoint = 1000;
System.out.println("Customer() 생성자 호출");
}
*/
// ========================기본생성자를 생성하지않고 매개변수가 있는 생성자 생성 =====
public Customer(int customerID , String customerName) {
this.customerID = customerID;
this.customerName = customerName;
customerGrade = "SILVER";
bonusPoint = 1000;
System.out.println("Customer(int , String ) 생성자 호출");
}
public String showCustomerInfo() {
return customerName + "님의 등급은 " + customerGrade + "이며 적립된 포인트는 " + bonusPoint + " 점 입니다.";
}
public int calcPrice(int price) {
return price = price * 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;
}
}
VIPCustomer 클래스의 생성자에서
super(CustomerID , customerName) 으로 상위 부모 클래스의 매개변수가 있는 생성자를 호출한다.
package inheritance;
public class VIPCustomer extends Customer {
double salesRatio;
private int agentID;
// 생성자를 추가하도록 추천해준다.
public VIPCustomer(int customerID, String customerName) {
super(customerID, customerName); // 상위클래스의 기본생성자가 없고 매개변수생성자가 있으면 명시적으로 호출해야 한다.
customerGrade = "VIP";
bonusRatio = 0.05; // 5프로
salesRatio = 0.1; // 10프로
}
/*
public VIPCustomer() { // 부모가 다른생성자가 있고 기본생성자가 없으면 제공되지 않는데 다른생성자가 없으면 기본생성자가 자동으로 제공된다
// 그래서 명시적으로 불러야 되는데
// super(0,null); // 기본생성자가 아닌 부모의 매개변수가 있는 생성자를 호출한다.
// super(); // 상위클래스의 기본생성자를 호출한다.
// this() 다른생성자를 호출한다.
customerGrade = "VIP";
bonusRatio = 0.05; // 5프로
salesRatio = 0.1; // 10프로
System.out.println("VIPCustomer() 생성자 호출 ");
*/
}
테스트 클래스
package inheritance;
public class CustomerTest {
public static void main(String[] args) {
/*
Customer customerLee = new Customer();
customerLee.setCustomerName("이순신");
customerLee.setCustomerID(10010);
customerLee.bonusPoint = 1000;
System.out.println(customerLee.showCustomerInfo());
*/
VIPCustomer customerKim = new VIPCustomer(10020,"김유신");
// customerKim.setCustomerName("김유신");
// customerKim.setCustomerID(10020);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
}
}
'JAVA Programming' 카테고리의 다른 글
[35] 메소드 오버라이딩 , 업캐스팅되면 과연어떤게 호출? 가상테이블 (0) | 2020.07.15 |
---|---|
[34] 상속에서의 묵시적 형변환 ( 업캐스팅 ) (0) | 2020.07.15 |
[32] 상속 , 다형성 이란 ? (0) | 2020.07.15 |
[29] ArrayList 을 이용하여 학생의 수강과목 학점 출력하기 (0) | 2020.07.15 |
[28] ArrayList 사용하기 (0) | 2020.07.15 |