Java_실습_상속_고객정보

권권·2023년 3월 8일
0

Java 예제🛒

목록 보기
4/14
post-thumbnail

자바 상속 상속 실습 (고객정보)

상속에 대한 예제를 풀어보았다.

문제

회사에서 고객 정보를 활용한 맞춤 서비스를 하기 위해 일반고객(Customer)과
이보다 충성도가 높은 우수고객(VIPCustomer)에 따른 서비스를 제공하고자 함

물품을 구매 할때 적용되는 할인율과 적립되는 보너스 포인트의 비율이 다름
여러 멤버십에 대한 각각 다양한 서비스를 제공할 수 있음
멤버십에 대한 구현을 클래스 상속을 활용하여 구현해보기

생각한 것

  1. 객체
    가. 고객 객체 (상속해줄)
    나. 우수고객 객체 (상속 받을)


  2. 필드
    가. 고객 ID
    나. 고객 이름
    다. 고객 등급
    라. 보너스 점수
    마. 보너스점수 계산 비율
    등등 향후 추가 될 수 있는 필드들. . .

  3. 메서드
    가. 물건 구입 할인율 적립 메서드
    나. 보너스 포인트 계산 메서드

클래스 구현

  1. 고객 (Customer) 클래스
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 등급은 할인은 없다)

2. 우수고객 (VIPCustomer) 클래스

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 를 통해서 상위 클래스를 호출한 뒤, 그 메서드를 활용해준 것도 눈여겨 봐야할 점이다.

그밖에 생성자를 통한 할인율과 보너스 비율을 수정해주었다.

3. 실행 클래스

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 자료형에 각 객체를 담아 서 출력해준 점도 꼭 기억하자

profile
안녕하세요

0개의 댓글