본문 바로가기
자바/개념

[java] 상속

by drCode 2021. 1. 27.
728x90
반응형

안녕하세요.

이번 포스팅은 상속에 대해 다뤄보겠습니다.

 

객체 지향 프로그래밍에서 상속이란?

유지보수하기 편하고 프로그램을 수정하거나 새로운 내용을 추가하는 것을 유연하게 해주는 것.

 

클래스 상속 문법은 아래와 같이 씁니다.

class B extends A {

 

}

 

EX)

class Mammal {

    ....

}

 

class Human extends Mammal {

    .....

}

 

구체적인 예제를 보여드리겠습니다.

 

상속을 사용하여 고객 관리 프로그램을 구현해보겠습니다.

클래스 : 고객클래스

멤버 변수 : 고객 아이디, 이름, 고객 등급, 보너스 포인트, 보너스 포인트 적립 비율

 

package inheritance;

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 showCustomerInfo() {
		return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
	}
}

 

이어서 새로운 고객 클래스인 VIP고객 클래스를 만들어보겠습니다.

package inheritance;

public class VIPCustomer_1 {
	private int customerID;			// 고객 아이디
	private String customerName;	// 고객 이름
	private String customerGrade;	// 고객 등급
	int bonusPoint;					// 보너스 포인트
	double bonusRatio;				// 적립 비율
	
	private int agentID;		// VIP 고객 담당 상담원 아이디
	double saleRatio;			// 할인율
	
	public VIPCustomer_1() {
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;		
	}
	
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;
		return price - (int)(price * saleRatio);
	}
	
	public int getAgentID() {
		return agentID;
	}
	
	public String showCustomerInfo() {
		return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
	}
}

 

소스를 보면, 몇개의 변수와 메서드들이 중복되는 것을 볼 수 있습니다.

고객 클래스를 상위로, VIP고객 클래스를 하위로 두면 더욱 편하게 구현할 수 있습니다.

 

package inheritance;

public class VIPCustomer extends Customer {
	private int agentID;
	double saleRatio;
	
	public VIPCustomer() {
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;
	}
	
	public int getAgentID() {
		return agentID;
	}
}

 

Customer 클래스에 일반 고객의 속성과 기능이 이미 구현되어 있기 때문에,

VIPCustomer 클래스는 Customer 클래스를 상속받고 VIP 고객에게 필요한 추가 속성과 기능을 구현하면 됩니다.

 

그러나, 이대로하면 오류가 발생합니다.

Customer 클래스에서 customerGrade가  private 변수이기 때문입니다.

 

private으로 되어있는 변수들을 protected로 바꿔주면 이 문제는 해결됩니다.

package inheritance;

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

 

그리고 getter와 setter도 추가해줍니다.

 

그러면, 상속 클래스를 테스트해보겠습니다.

 

package inheritance;

public class CustomerTest1 {
	public static void main(String[] args) {
		Customer customerLee = new Customer();
		customerLee.setCustomerID(10010);
		customerLee.setCustomerName("이순신");
		customerLee.bonusPoint = 1000;
		System.out.println(customerLee.showCustomerInfo());
		
		VIPCustomer customerKim = new VIPCustomer();
		customerKim.setCustomerID(10020);
		customerKim.setCustomerName("김유신");
		customerKim.bonusPoint = 10000;
		System.out.println(customerKim.showCustomerInfo());
	}
}

 

실행 결과는 이미지와 같습니다.

 

이번 포스팅은 여기서 마치겠습니다.

 

다음 포스팅은 상속에서 클래스 생성과 형 변환에 대해 다뤄보겠습니다.

읽어주셔서 감사합니다.

728x90
반응형

'자바 > 개념' 카테고리의 다른 글

[java] 묵시적 형 변환  (0) 2021.01.27
[java] 상속 super  (0) 2021.01.27
[java] 상속에서 클래스 생성  (0) 2021.01.27
[java] 싱글톤 패턴 응용  (0) 2021.01.26
[java] 싱글톤 패턴  (0) 2021.01.26

댓글