본문 바로가기
카테고리 없음

[JAVA] 메서드 오버라이딩 ( Method Overriding )

by Jayce_choi 2021. 6. 28.
반응형

1. 오버 라이딩이란 

메서드 오버 라이딩은 상위 클래스에서 정의된 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우에 하위 클래스에서 해당 메서드를 재 정의할 수 있는데 이를 메서드 오버 라이딩이라고 합니다.

출처 : 위키백과 ( 메소드 오버라이딩 ) 

메서드 오버라이딩은 상속과 뗄 수 없는 관계입니다. 상속은 extends라는 키워드를 이용하여 부모 클래스의 메서드 및 필드를 물려받는 방법이었습니다. 때문에 자식 클래스에서는 부모 클래스의 메소드를 정의하지 않아도 사용이 가능합니다.

그러나 자식 클래스에서 부모 클래스로 부터 상속받은 메서드를 다르게 정의해야 할 필요가 있을 때는 어떻게 할까요??

 

예를 하나 들어보도록 하겠습니다.

이전의 게시글인 상속에서 해결하지 못했던 문제 ( 새로운 등급을 만들면서 VIP 고객에게 제공하는 할인율과 세일 가격을 어떻게 적용할지 구현 )를 해보겠습니다.

 

[JAVA] 상속이란?

객체 지향 프로그래밍에서 중요한 특징 중 하나로 상속이라는 개념이 있습니다. 상속은 단어 자체로 무엇인가를 물려받는다는 의미를 지녔습니다. 예를 들어서 부모가 자식에게 물려주는 재산

domybestinlife.tistory.com

이전에 Customer라는 클래스에서는 calcPrice라는 메서드가 존재했습니다. 

public int calcPrice(int price){
	bonusPoint += price * bonusRatio;
	return price; 
}

그러나 해당 메소드는 일반 고객을 위한 메서드였으며 VIP 클래스 고객은 10% 할인을 받을 수 있기 때문에 맞지 않는 메서드입니다. 때문에 VIP 클래스에 맞는 calcPrice가 필요로 한데 이렇게 상위 클래스에 정의한 메서드가 하위 클래서에서 구현할 내용과 맞지 않을 때 하위 클래스에서 해당 메서드를 재정의 할 수 있는데 이를 메서드 오버 라이딩(Method Overiding)이라고 합니다.


오버 라이딩을 하기 위해서는 다음과 같은 조건이 필요합니다.

오버 라이딩을 위해 반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형이 반드시 같아야 합니다. 그렇지 않으면 자바 컴파일러는 재정의한 메서드를 기존 메서드와 다른 메서드로 인식하게 됩니다.

 

2. 예제 - calcPrice 생성 

한번 예제를 통해서 어떤 말인지 보겠습니다.

- VIP 고객 클래스의 제품 가격 계산 메서드 재정의하기.

package inheritance;

public class VIPCustomer extends Customer {
	private int agentID;
	double saleRatio;

	public VIPCustomer(int customerID, String customerName, int agentID) {
		super(customerID, customerName);
		customerGrade ="VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1; 
		this.agentID = agentID;
		System.out.println("VIPCustomer(int,String) 생성자 호출");
	}
	
	public int getAgentID() {
		return agentID;
	}
	public String showVIPInfo() {
		return super.getCustomerInfo() + "담당 상담원 아이디는" + agentID + "입니다.";
	}
	
	// 추가된 코드 
	@Override
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio; 
		return price - (int)(price * saleRatio);
	}
	
}

추가된 코드는 @Override 와 함께 calcPrice 메서드입니다.

* @Override 어노테이션은 '이 메서드는 재정의된 메서드입니다'라고 컴파일러에 명확하게 알려주는 역할을 수행합니다.

 


추가 내용 

상위 클래스의 메서드를 재정의할 때는 조금 전 코드와 같이 메서드 이름을 직접 사용하여 작성을 해도 되며 또는 이클립스의 기능을 활용하여 자동 생성을 할수있도록 할수있습니다. 밑에 과정을 따라가 보겠습니다. 

1. 코드(화면)에서 빈칸에 오른쪽 마우스 버튼을 누르고 [Source → Override/Implement Methods...]를 누르면

 

2. 다음과 같이 선택지가 보이며(하단의 그림) 여기서 calcPrice를 체크하고 Ok를 클릭하면 됩니다.

그리고 추가적으로 해당 코드는 자동으로 생성된 코드이기 때문에 10% 할인이라는 코드가 없습니다. 때문에 10% 할인이라는 코드를 위에 참조 코드를 이용하셔서 추가해주시면 되겠습니다. 

* 해당 방법을 이용하려면 이전에 타이핑으로 기입했던 calcPrice 함수를 주석처리를 해야 선택지가 보이며 체크를 할 수 있습니다. ( 자동생성된 calcPrice와 미리 적어두었던 calcPrice가 겹치면 안되기 때문입니다. ) 


2. 예제 - OverridingTest1 생성 및 calcPrice 함수 테스트 

이제 calcPrice 메서드를 테스트해보겠습니다.

Main문이 포함된 OverridingTest1 클래스를 만듭니다.

package inheritance;

public class OverridingTest1 {
	public static void main(String[] args) {
		Customer customerLee = new Customer(10010,"이순신");
		customerLee.bonusPoint = 1000;
		
		VIPCustomer customerKim = new VIPCustomer(10020,"김유신",12345);
		customerKim.bonusPoint = 10000;
		
		int price = 10000;
		System.out.println(customerLee.getCustomerName() + "님이 지불해야 하는 금액은 " + customerLee.calcPrice(price)+"원입니다");
		System.out.println(customerKim.getCustomerName() + " 님이 지불해야 하는 금액은 " + customerKim.calcPrice(price) + "원입니다.");
	}
}

그리고 실행을 하면 다음과 같이 결과가 나오게 됩니다.

" 이순신 님이 지불해야 하는 금액은 10000원입니다. "
" 김유신 님이 지불해야 하는 금액은 9000원입니다. " 

이로써 VIP 클래스에서 정의된 calcPrice와 일반 Customer를 위한 클래스에서 정의되었던 calcPrice가 동일한 이름이지만 기능적으로 수행은 다르게 했다는 것을 이번 예제를 통해서 알수있었습니다.

 


추가 내용

기타 애노테이션

애노테이션(Annotation) : 영어로는 주석이라는 의미. @기호와 함께 사용하며 '@애노테이션 이름'으로 표현합니다.

애노테이션은 위의 override와 동일하게 컴파일러에게 특정한 정보를 제공해주기 위해서 사용됩니다.

주로 사용되는 표준 애노테이션은 다음과 같습니다.

  1. @Override : 재정의된 메서드라는 정보 제공
  2. @Fuctionalinterface : 함수형 인터페이스라는 정보 제공
  3. @Deprecated : 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용
  4. @SuppressWarnings : 특정 경고가 나타나지 않도록 하는 기능 수행

 

출처: Do it! Introduction to Java Programming 

반응형

댓글