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 |
댓글