본문 바로가기
언어/JAVA

상속에서 클래스 생성 과정과 형 변환

by step 1 2021. 4. 17.
반응형

하위 클래스가 생성 되는 과정

하위 클래스를 생성하면 상위 클래스가 먼저 생성 됨

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