각진 세상에 둥근 춤을 추자

[Java] 상속 - 고객 관리 프로그램 본문

Java

[Java] 상속 - 고객 관리 프로그램

circle.j 2022. 9. 19. 19:09

상속(Inheritance)이란, 기존에 존재하는 클래스로부터 필드와 메소드를 이어받고, 필요한 기능을 추가할 수 있는 기법이다.

즉, 상속을 이용하여 검증된 소프트웨어를 재사용할 수 있어 신뢰성 있는 소프트웨어를 손쉽게 개발, 유지 및 보수할 수 있다.

” extends ”

자바에서는 ‘extends’ 키워드를 이용하여 상속을 나타낸다.

상속하는 클래스를 부모 클래스(슈퍼 클래스)라고 하고, 상속받는 클래스를 자식 클래스(서브 클래스)라고 한다.

 

예를 들어 B클래스가 A클래스에서 상속받는다고 하면 다음과 같이 나타낼 수 있다.

 

class B extends A {
}

 

 

회사에서 고객 정보를 가지고 맞춤 서비스를 제공하는 고객 관리 프로그램을 구현해 본다.

고객 클래스를 구현하기 위해 클래스 속성을 멤버 변수로 선언한다.

고객 (Customer) 클래스의 속성은 고객 아이디, 이름, 고객 등급, 보너스 포인트, 보너스 포인트 적립 비율로 선언한다.

 

(1) 일반 고객 관리 프로그램 구현하기

 

package ch08_1;

public class Customer {

	// 멤버 변수
	private int customerID;		// 고객 아이디
	private String customerName;	// 고객 이름
	private 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 show() {
		return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
	}
	
}

 

프로그램에서 사용한 멤버 변수를 살펴보면 다음과 같다.

멤버 변수 설명
customerID 고객 아이디
customerName 고객 이름
customerGrade 고객 등급
- 기본 생성자에서 지정되는 기본 등급은 SILVER
bonusPoint 고객의 보너스 포인트
- 고객이 제품을 구매하는 경우 누적되는 보너스 포인트
bonusRatio 보너스 포인트 적립 비율
- 고객이 제품을 구매할 때 구매 금액의 일정 비율이 보너스 포인트로 적립된다. 이대 계산되는 적립 비율
- 기본 생성자에서 지정되는 적립 비율은 1%이다. 
  즉, 10,000원짜리를 사면 100원이 적립

 

프로그램에서 사용한 메서드는 다음과 같다.

메서드 설명
Customer() 기본 생성자
고객 한 명이 새로 생성되면 
customerGrage = SILVER,
bonusRatio = 1%
calcPrice(int Price) 가격에 대한 보너스 포인트 비율을 적용하여 보너스 포인트 적립
show() 고객 정보를 출력
(고객 이름, 등급, 현재 적립된 포인트)

 

 

(2) VIP 고객 관리 프로그램 구현하기

 

VIPCustomer 클래스의 멤버 변수는 일반 고객 클래스와 동일하게 고객 아이디, 고객 이름, 고객 등급, 보너스 포인트, 보너스 포인트 적립 비율이 있고,

추가로 당담 상담원 아이디과 할인율이 있다. 

일반 고객 클래스와 중복되는 부분은 상속받은 후 VIP 고객에게 필요한 추가 속성과 기능을 구현한다.

 

package ch08_1;

public class VIPCustomer extends Customer{
	
	// 추가 속성
	private int agentID;	// VIP 고객 상담원 아이디
	double saleRatio;	// 할인율
	
	public VIPCustomer() {
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;
	
	}
	
	public int getAgentID() {
		return agentID;
	}
	
}

하지만 이렇게 프로그램을 작성하게 되면 customerGrade 변수에서 오류가 발생하는 것을 볼 수 있다.

 

왜냐하면, 상위 클래스에서 customerGrade를 private 변수로 선언했기 때문이다.

따라서 외부 클래스에서는 이 변수를 사용할 수가 없다. 

그렇다면 해당 private 변수를 protected 변수로 변경해 준다. 

protected 변수는 상속된 하위 클래스를 제외한 나머지 외부 클래스에서는 private과 동일한 역할을 한다.

또한 protected 예약어로 선언한 변수를 외부에서 사용할 수 있도록 get(), set() 메소드도 추가한다.

 

package ch08_1;

public class Customer {

	// 멤버 변수
	protected int customerID;	// 고객 아이디
	protected String customerName;	// 고객 이름
	protected String customerGrade;	// 고객 등급
	int bonusPoint;	// 보너스 포인트
	double bonusRatio;	// 적립 비율
	
	
	
	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 Customer() {
		customerGrade = "SILVER";	// 기본 등급
		bonusRatio = 0.01;	// 보너스 포인트 기본 적립 비율
	}
	
	// 보너스 포인트 적립, 지불 가격 계산 메서드
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;	// 보너스 포인트 계산
		return price;
	}
	
	// 고객 정보를 반환하는 메서드
	public String show() {
		return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
	}
	
}

 

 

(3) 작성한 프로그램을 테스트할 프로그램을 생성한다.

 

package ch08_1;

public class CustomerTest1 {
	public static void main(String[] args) {
		
		// 일반 고객 
		Customer cus1 = new Customer();
		cus1.setCustomerID(10010);
		cus1.setCustomerName("이순신");
		cus1.bonusPoint=1000;
		System.out.println(cus1.show());
		
		// VIP 고객
		VIPCustomer cus2 = new VIPCustomer();
		cus2.setCustomerID(10020);
		cus2.setCustomerName("김유신");
		cus2.bonusPoint=10000;
		System.out.println(cus2.show());
		
		
	}
}

 

'Java' 카테고리의 다른 글

[Java] 다형성  (0) 2022.09.19
[Java] 메소드 오버라이딩  (0) 2022.09.19
[Java] ArrayList - 학생 성적 출력 프로그램  (0) 2022.09.19
[Java] ArrayList 클래스 사용하기  (0) 2022.09.19
[Java] 다차원 배열  (0) 2022.09.19