회사에서 고객 정보를 활용한 맞춤 서비스를 하기 위해 일반고객(Customer)과
이보다 충성도가 높은 우수고객(VIPCustomer)에 따른 서비스를 제공하고자 함
물품을 구매 할때 적용되는 할인율과 적립되는 보너스 포인트의 비율이 다름
여러 멤버십에 대한 각각 다양한 서비스를 제공할 수 있음
멤버십에 대한 구현을 클래스 상속을 활용하여 구현해보기
객체
가. 고객 객체 (상속해줄)
나. 우수고객 객체 (상속 받을)
필드
가. 고객 ID
나. 고객 이름
다. 고객 등급
라. 보너스 점수
마. 보너스점수 계산 비율
등등 향후 추가 될 수 있는 필드들. . .
메서드
가. 물건 구입 할인율 적립 메서드
나. 보너스 포인트 계산 메서드
package ch02;
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) 생성자 호출");
}
// 할인된 가격을 계산해 줄 메서드
// 보너스 포인트까지 함께 계산해줬다.
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price; // ==> 일반등급은 가격할인 혜택은 없음 !
}
public String showCustomerInfo() {
return customerName + "님의 등급은 " + customerGrade +
"이며, 보너스 포인트는 " + bonusPoint + "입니다";
}
}
우선 해당 클래스는 상속해줄 클래스이기 때문에 접근 제한자를 protected로 놓았다. protected는 패키지내 접근과 상속 관계끼리의 접근을 허용하는 접근제한자이다.
그리고 생성자를 통해서 int와 String 매개변수를 가지고 해당 매개변수로 각각 변수들을 초기화 해 주었으며, coustomerGrade와 bonusRatio는 생성자 호출과 함께 초기화 될 수 있도록 하였다.
그리고 할인된 가격을 계산해줄 메서드를 만들어주었는데, 받게될 보너스 포인트 추가까지 함께 계산될 수 있게 하였다. (SILVER 등급은 할인은 없다)
package ch06;
public class VIPCustomer extends Customer {
private int agentID; // ==> 전문 상담원 필드 추가
double salesRatio; // => 가격 할인율 추가
/*
* ==> 그대로 생성자를 만들려고 하면 부모 필드의 접근 제한자 때문에 오류 발생 ==> 부모필드의 접근 제한자를 protected로
* 바꿔주자. public VIPCustomer() { customerGrade = "VIP"; //오류 발생 bonusRatio =
* 0.05; salesRatio = 0.1;
*
* System.out.println("VIPCustomer() 생성자 호출"); }
*/
public VIPCustomer(int customerID, String customerName, int agentID) {
super(customerID, customerName);
this.agentID = agentID;
customerGrade = "VIP";
bonusRatio = 0.05;
salesRatio = 0.1;
System.out.println("VIPCustomer(int, String) 생성자 호출");
}
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price - (int) (price * salesRatio);
}
public int getAgentID() {
return agentID;
}
public String showCustomerInfo(){
return super.showCustomerInfo() + " 담당 상담원 번호는 " + agentID + "입니다";
}
public void setAgentID(int agentID) {
this.agentID = agentID;
}
}
VIPCustomer 클래스는 Customer 클래스의 기능들을 대부분 가지고 있기 때문에 상속을 통해서 구현하였다.
중간에 오류 발생으로 나온 것은, 접근제한자를 private 에서 protected로 바꾸기 전에 생긴 오류이다.
Customer 클래스에 추가된 것은
필드 : agentID, salesRatio
메서드 : agetnID getter/setter
또한 super 를 통해서 상위 클래스를 호출한 뒤, 그 메서드를 활용해준 것도 눈여겨 봐야할 점이다.
그밖에 생성자를 통한 할인율과 보너스 비율을 수정해주었다.
package ch02;
import java.util.ArrayList;
public class CustomerTest {
public static void main(String[] args) {
ArrayList<Customer> customerList = new ArrayList<Customer>();
// 자동형변환 되어 들어간다.
Customer customerLee = new Customer(10010, "이순신");
Customer customerShin = new Customer(10020, "신사임당");
Customer customerHong = new GoldCustomer(10030, "홍길동");
Customer customerKim = new VIPCustomer(10050, "김유신", 12345);
customerList.add(customerLee);
customerList.add(customerShin);
customerList.add(customerHong);
customerList.add(customerKim);
System.out.println("====== 고객 정보 출력 =======");
for( Customer customer : customerList){
System.out.println(customer.showCustomerInfo());
}
System.out.println("====== 할인율과 보너스 포인트 계산 =======");
int price = 10000;
for( Customer customer : customerList){
int cost = customer.calcPrice(price);
System.out.println(customer.getCustomerName() +" 님이 " + + cost + "원 지불하셨습니다.");
System.out.println(customer.getCustomerName() +" 님의 현재 보너스 포인트는 " + customer.bonusPoint + "점입니다.");
}
}
}
실행 클래스는 위와 같다.
눈여겨 봐야할 것은 자동 형 변환일 것이다.
VIPCustomer 객체를 Customer 타입으로 자동형변환 해주었다.
위의 실행문에서 구현하려고 하는 것이 Customer 객체의 모든 메서드를 담고 있었기 때문에 형변환을 활용하여 진행할 수 있었다.
그리고 ArrayList 자료형에 각 객체를 담아 서 출력해준 점도 꼭 기억하자