[Java] 상속과 Overriding(오버라이딩)
상속이란 관계성.
상속하는 클래스(조상 클래스, 부모클래스, 슈퍼클래스, 베이스클래스) 가 있고
상속받는 클래스(자손클래스, 자식클래스, 서브클래스, 파생클래스) 가 있다.
자바에서 상속을 구현할 떄에는 extends 예약어를 사용한다.
class subClass extends superClass {
} // subClass 는 superClass 를 상속받는다.
이 때, 상위클래스는 큰 틀. 즉 일반적인 개념이나 기능, 관념을 가지고
하위클래스는 보다 구체적인 개념이나 기능, 관념을 가진다.
따라서 하위클래스가 공통적으로 공유하는 부분은 상위클래스에서 관리하고, 하위클래스를 구분짓는 부분을 하위클래스에서 정의한다.
super
하위 클래스가 생성될 때는 상위 클래스의 생성자가 먼저 호출된다.
하위 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우, 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super를 추가한다.
따라서 super 로 호출되는 생성자는 상위 클래스의 기본 생성자라 할 수 있다.
public class Customer {
// 생성자
public Customer(int customerID, String customerName) { // 상위클래스
this.customerID = customerID;
thus.customerName = customerName;
customerGrade = "SILVER";
bonusRatio = 0.01;
}
}
public class VIPCustomer extends Customer { // 하위클래스
// 생성자
public VIPCustomer( int customerID, String customerName) {
super(customerID, customerName) // super를 사용해 상위 클래스의 매개변수를 가져옴
cosutomerGrade = "VIP";
bonusRatio = 0.05l
salesRatio = 0.1;
}
}
오버라이딩(Overrding)
상위 클래스에 정의된 메소드와 이름이 같은 메소드를 하위 클래스에 재정의하는 것을 오버라이딩이라고 한다.
ex)
Public class Customer { // 상위 클래스
public int CalcPrice ( int price) {
bonusRatio += price * bonusRatio;
return price;
}
}
상위 클래스인 Customer의 CalcPrice 라는 메소드에는 price 라는 int 타입 데이터를 입력 받아 bonusRatio를 계산한 후, price를 리턴한다.
public class VIPCustomer { // 하위클래스
@Override
public int CalcPrice(int price) {
bonusRatio += price * bonusRatio;
return price - (int)(price*slaeRatio);
}
}
하위클래스인 VIPCustomer 에서는 상위클래스와 똑같은 이름인 CalcPrice (){} 메소드를 사용하였지만 return 의 값이 달라졌다. 이와 같이 메소드의 선언부(public 접근제한, int 데이터타입, 매개변수의 갯수, 매개변수의 자료형) 등은 상위클래스와 동일하게 유지한 채 메소드의 중괄호 안의 내용 {} 을 재정의할 수 있는 것이 오버라이딩이다.
사례
상위 클래스인 Customer 클래스
public class Customer {
// 필드
int customerID; // 고객 아이디
String customerName; // 고객 이름
String customerGrade; // 고객 등급. 기본 등급은 SILVER로 할 예정
int bonusPoint; // 보너스 보인트 : 고객이 제품을 구매할 경우 누적되는 포인트
/*
보너스 포인트 적립 비율
- 등급에 따라서 보너스포인트가 적립됨. SILVER 의 경우에는 0.01, VIP는 0.1
*/
double bonusRatio; // 백분율로 나올 것이기 때문에 double 로 활용
// 생성자
public Customer( int customerID, String customerName ) {
this.customerID = customerID;
this.customerName = customerName;
// 매개변수가 주어지면
customerGrade = "SILVER";
bonusRatio = 0.01;
}
// 메소드 생성
// 지불해야 할 금액을 나타내는 메소드를 생성할 것.
// 지불하는 금액은 상위클래스는 그대로 반환됨
// 보너스포인트는 금액 * 비율을 곱하여 리턴함
public int calcPrice(int price) {
bonusPonint += price * bonusRatio;
return price;
}
// 고객 정보를 출력하는 메소드. 고객의 이름과 등급, 포인트 잔액을 출력할 것이다.
public String showCustomerInfo(){
return custoerName + "님의 등급은 " + customerGrade + "이며, 적립된 보너스 포인트는 "
+ bonusPoint + "점 입니다.";
}
}
하위 클래스인 VIPCustomer 클래스 개설
public class VIPCustomer extends Customer {
double slaesRatio;
public VIPCustomer(int customerID, String customerName) {
super(customerID, customerName); // super 호출을 통해 상위클래스의 필드변수를 가져옴
customerGrade = "VIP";
bonusRatio = 0.05; // 보너스 포인트 5% 적립
salesRatio = 0.1; // 할인금액은 10%;
}
@Override
//오버라이딩 메소드 정의
public int calcPrice(int price){ // 상위클래스의 calcPrice와 동일한 데이터형, 이름, 매개변수 타입, 이름
bonusPoint += price * bonusRatio;
return price - (int)(price * saleRatio);
}
}
테스트 실행
public static void main(String[] args) {
// 고객데이터-매개변수를 가진 새로운 Customer 클래스를 생성할 것이다.
Customer customerLee = new Customer ( 10010, "이순신");
customerLee.bonusPoint = 1000;
// VIPCustomer 클래스를 생성하고, VIPCustomerKim 의 매개변수를 대입한다.
// VIPCustomer 는 Customer 의 하위클래스이기 때문에
// Customer 의 필드변수인 customerID, customerName 등을 사용할 수 있다.
Customer customerKim = new VIPCustomer(10020, "김유신");
customerKim.bonusPoint = 10000;
int priceLee = customerLee.calcPrice(10000); // 상위클래스의 calcPrcie 메소드를 이용.
// 상위 클래스의 calcPrice는 price 를 그대로 return 하기 때문에 10000 이 출력됨
int priceKin = customerKim.calcPrice(10000); // 하위클래스의 오버라이딩된 calcPrcie 메소드를 이용.
// 오버라이딩된 calcPrice는 price-(int)(price*salesRatio) 를 return, 따라서 10000-1000=9000이 출력
System.out.println(priceLee.showCustomerInfo() +
" 지불금액은 " + priceLee + "원 입니다.");
System.out.println(priceKim.showCustomerInfo() +
" 지불금액은 " + priceKim + "원 입니다.");
}
출력결과
이순신님의 등급은 SILVER이며, 적립된 보너스 포인드는 1100점 입니다. 지불금액은 10000원 입니다.
김유신님의 등급은 VIP이며, 적립된 보너스 포인트는 10500점 입니다. 지불금액은 9000원 입니다.
참고자료 :
'Java' 카테고리의 다른 글
[Java] Array와 List 기초 학습 (0) | 2022.01.05 |
---|---|
[Java] 기초 자료형과 문자 포매팅. (0) | 2022.01.05 |
[Java] class 의 구성요소 : ② 메소드 (0) | 2022.01.03 |
[Java] class의 구성요소 : ① 필드, 생성자 (0) | 2022.01.03 |
[Java] Main 메소드의 의미 ② static(정적) 변수와 메소드 (0) | 2022.01.02 |