클래스에서 상속의 의미는 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속받아서 속성이나 기능이 확장되는 클래스를 구현합니다.
상속하는 클래스 : 상위클래스, parent class, base class, super class
상속받는 클래스 : 하위클래스, child class, derived class, subclass
//b클래스가 a클래스로부터 상속받는다.
class B extends A{
}
extends뒤에는 단 하나의 class만 사용할 수 있으며, 자바는 single inheritance만을 지원합니다.
package inheritance;
public class Customer {
//private은 상속관계에서도 외부클래스에 접근할 수 없다.
//따라서 상속받은 클래스에게 접근권한을 주고 싶다면 protected를 사용하면 된다.
//상위클래스에 protected로 선언된 변수나 메서드는 다른 외부 클래스에서 사용할 수 없지만 하위클래스에서는 사용가능
protected int customerID;
protected String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
public Customer(){
customerGrade="SILVER";
bonusRatio=0.01;
}
public int calcPrice(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;
}
public int getBonusPoint() {
return bonusPoint;
}
public void setBonusPoint(int bonusPoint) {
this.bonusPoint = bonusPoint;
}
public double getBonusRatio() {
return bonusRatio;
}
public void setBonusRatio(double bonusRatio) {
this.bonusRatio = bonusRatio;
}
}
package inheritance;
//더 확장된 기능을 구체적으로 쓰이기 위해 Customer클래스의 기능을 상속받음
public class VIPCustomer extends Customer {
//담당상담원,할인율 선언
double salesRatio;
private int agentID;
public VIPCustomer() {
customerGrade="VIP";
bonusRatio=0.05;
bonusRatio=0.1;
}
}
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();
customerKim.setCustomerName("김유신");
customerKim.setCustomerID(10020);
customerKim.bonusPoint=10000;
System.out.println(customerKim.showCustomerInfo());
}
}
하위클래스에서 상위클래스의 생성자를 호출하는 코드가 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super()를 추가함
super()로 호출되는 생성자는 상위클래스의 기본 생성자임
만약 상위클래스의 기본생성자가 없는 경우 (매개변수가 있는 생성자만 존재하는 경우) 하위 클래스는 명시적으로 상위클래스의 생성자를 호출해야함
public class Customer {
protected int customerID;
protected String customerName;
protected String customerGrade;
int bonusPoint;
double bonusRatio;
// 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) 생성자 호출");
}
Customer의 상위클래스가 없으면 위와 같이 에러가 발생하게 되는데 VIPCostomer에 super()를 주게되어도 super가 호출할 수 있는 기본생성자가 없는 상위클래스가 없으므로 에러가 난다.
매개변수가 있는 하위클래스를 호출하고 싶으면 아래와 같이 super를 정의해주면 된다.
package inheritance;
//더 확장된 기능을 구체적으로 쓰이기 위해 Customer클래스의 기능을 상속받음
public class VIPCustomer extends Customer {
//담당상담원,할인율 선언
double salesRatio;
private int agentID;
//생성자가 있는 VIPCustomer호출
public VIPCustomer(int customerID, String customerName) {
//super에 customerID,customerName생성자호출
super(customerID, customerName);
customerGrade="VIP";
bonusRatio=0.05;
bonusRatio=0.1;
}
}
Customer customerKim=new VIPCustomer(10020,"김유신");
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());
//상위클래스Customer에 customerKim변수를 생성을 하고 하위클래스VIPCustomer에 10020,"김유신"을 대입을 하게 되면 하위클래스가 상위클래스에 대입되기 때문에 에러발생하지 않는다
Customer customerKim=new VIPCustomer(10020,"김유신");
// customerKim.setCustomerName("김유신");
// customerKim.setCustomerID(10020);
customerKim.bonusPoint=10000;
System.out.println(customerKim.showCustomerInfo());
}
}
VIPCustomer()생성자의 호출로 인스턴스는 모두 생성되었지만 타입이 Customer이므로 접근 할 수 있는 변수나 메서드는 Customer의 변수와 메서드이다.