본문 바로가기
자바/개념

[java] 상속 super

by drCode 2021. 1. 27.
728x90
반응형

이번 포스팅은 예약어인 super에 대해서 다뤄보도록 하겠습니다.

 

super : 부모를 부르는 예약어

 

super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용합니다.

 

하위 클래스는 상위 클래스의 주소, 즉 참조 값을 알고 있습니다.

 

this : 자기 자신의 참조 값을 가지고 있는 것

super : 상위 클래스의 생성자를 호출하는데도 사용합니다.

 

package inheritance;

public class VIPCustomer extends Customer {
	private int agentID;
	double saleRatio;
	
	public VIPCustomer() {
		// super(); << 자동으로 호출됨
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;
		System.out.println("VIPCustomer() 생성자 호출");
	}
	
	public int getAgentID() {
		return agentID;
	}
}

 

 

하위클래스 생성자만 호출했는데 상위 클래스 생성자가 호출되는 이유는

하위 클래스 생성자에서 super()를 자동으로 호출하기 때문입니다.

 

※ super  예약어로 매개변수 있는 생성자 호출하기

Customer 클래스를 생성 시 고객 ID와 이름을 반드시 지정해야 하는 경우

public Customer(int customerID, String customerName) {
	this.customerID = customerID;
    this.customerName = customerName;
    customerGrade = "SILVER";
    bonusRatio = 0.01;
    System.out.println("Customer(int, String) 생성자 호출");
}

 

이렇게 하면 VIPCustomer에서 오류가 발생합니다.

Customer 클래스의 디폴트 생성자가 정의되지 않았기 때문입니다.

 

웬만하면 디폴트 생성자를 먼저 생성해주고

명시적으로 파라미터가 포함된 생성자를 만들어 주는 것이 좋습니다.

 

Customer 클래스를 수정해보겠습니다.

 

	// 디폴트 생성자
	public Customer() {
		customerGrade = "SILVER";		// 기본 등급
		bonusRatio = 0.01;				// 보너스 포인트 기본 적립 비율
		System.out.println("Customer() 생성자 호출");
	}
	
	// 명시적으로 추가한 파라미터가 있는 생성자
	public Customer(int customerID, String customerName) {
		this.customerID = customerID;
		this.customerName = customerName;
		customerGrade = "SILVER";		// 기본 등급
		bonusRatio = 0.01;				// 보너스 포인트 기본 적립 비율
		System.out.println("Customer(int, String) 생성자 호출");
	}

 

이처럼 파라미터가 있는 생성자도 추가해줍니다.

 

VIPCustomer 생성자도 아래처럼 수정해줍니다.

public VIPCustomer(int customerID, String customerName, int agentID) {
		super(customerID, customerName);
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;
		this.agentID = agentID;
		System.out.println("VIPCustomer(int, String, int) 생성자 호출");
	}

CustomerTest2를 아래처럼 수정해줍니다.

package inheritance;

public class CustomerTest2 {
	public static void main(String[] args) {
		VIPCustomer customerKim = new VIPCustomer(10020, "김유신", 12345);
		customerKim.setCustomerID(10020);
		customerKim.setCustomerName("김유신");
		customerKim.bonusPoint = 10000;
		System.out.println(customerKim.showCustomerInfo());
	}
}

 

 

 

CustomerTest2를 실행시키면 

위와 같은 결과가 나옵니다.

상위 클래스 생성자 호출이 끝나면 VIPCustomer 하위 클래스 생성자의 내부 코드 수행이 마무리 됩니다.

728x90
반응형

'자바 > 개념' 카테고리의 다른 글

[java] 자바 RMI(Remote Method Invocation)  (0) 2021.09.10
[java] 묵시적 형 변환  (0) 2021.01.27
[java] 상속에서 클래스 생성  (0) 2021.01.27
[java] 상속  (1) 2021.01.27
[java] 싱글톤 패턴 응용  (0) 2021.01.26

댓글