반응형
    
    
    
  하위 클래스가 생성 되는 과정
하위 클래스를 생성하면 상위 클래스가 먼저 생성 됨
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 |