각진 세상에 둥근 춤을 추자

[Java] 메소드 오버라이딩 본문

Java

[Java] 메소드 오버라이딩

circle.j 2022. 9. 19. 23:23

 

하위 클래스인 VIPCustomer에서 super 예약어를 이용해  상위 클래스 Customer 클래스를 호출한다.

자식 클래스는 부모 클래스의 메소드를 상속받아서 사용할 수 있다.

하지만 상속은 받았더라도, 목적에 맞지 않아 변경하는 경우가 있다.

이때 메소드 오버라이딩(method overriding)은 자식 클래스가 부모 클래스의 메소드를 자신의 필요에 맞추어 재정의한다.

(단, 메소드의 이름이나 매개 변수, 반환형은 동일해야 한다.)

 

(1) 상위 클래스 - Customer

package ch08_3;

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 + "입니다.";
	}
	
}

 

(2) 하위 클래스 - VIPCustomer

package ch08_3;

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;
	}

	// 재정의한 메소드
	@Override
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;
		
		// 할인된 가격을 계산하여 반환
		return price - (int)(price * saleRatio);
	}

	
}

 

override를 할 때는 직접 작성하는 방법도 있지만, 이클립스의 기능을 활용할 수도 있다.

 

Source - Override/Implement Methods를 통해 간편하게 Override 할 수 있다. 

 

이때, @override란 해당 메서드가 재정의된 메서드임을 컴파일러에게 알려주는 애노테이션(주석)을 의미한다.

 

두 고객을 생성해 지불하는 가격을 출력해 보는 테스트 프로그램을 작성한다.

 

package ch08_3;

public class OverridingTest1 {
	public static void main(String[] args) {
		
		// 일반 고객 
		Customer cus1 = new Customer();
		cus1.setCustomerID(10010);
		cus1.setCustomerName("이순신");
		cus1.bonusPoint=1000;
				
		// VIP 고객
		VIPCustomer cus2 = new VIPCustomer();
		cus2.setCustomerID(10020);
		cus2.setCustomerName("김유신");
		cus2.bonusPoint=10000;
		
		int price = 10000;
		System.out.println(cus1.getCustomerName()+ " 님이 지불해야 하는 금액은 "+cus1.calcPrice(price)+"입니다.");
		System.out.println(cus2.getCustomerName()+ " 님이 지불해야 하는 금액은 "+cus2.calcPrice(price)+"입니다.");
		
				
	}
}