04. 메서드 재정의(Overriding), 메서드 오버로딩(overloading)

0

Java 공부

목록 보기
4/18

하위 클래스에서 메서드 재정의 하기

  • 오버라이딩(overriding) : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음
  • VIPCustomer 클래스의 calcPrice()는 할인율이 적용되지 않음
  • 재정의 하여 구현해야 함
@Override
public int calcPrice(int price) {
	bonusPoint += price * bonusRatio;
	return price - (int)(price * salesRatio);
}

@overriding 애노테이션 (annotation)

  • 애노테이션은 원래 주석이라는 의미
  • 컴파일러에게 특별한 정보를 제공해주는 역할
  • 자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데, JDK 1.5 버전 이상에서 사용 가능하다.
  • @overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 남

Customer

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

VIPCustomer

	@Override
	public int calcPrice(int price) { // 계산
		bonusPoint += price * bonusRatio; // 포인트 적립
		price -= (int)(price * salesRatio); // 할인된 가격 => 소수점이 나올수도있기에 int처리
		return price;
	}

형 변환과 오버라이딩 메서드 호출

public class CustomerTest {

	public static void main(String[] args) {

		Customer customerLee = new Customer(10001, "이순신");
		customerLee.bonusPoint = 1000;
		int price = customerLee.calcPrice(1000);
		System.out.println(customerLee.showCustomerInfo() +"내실 금액은" +price + "원 입니다.");

		VIPCustomer customerKim = new VIPCustomer(10002, "김유신");
		customerKim.bonusPoint = 10000;
		price = customerKim.calcPrice(1000);
		System.out.println(customerKim.showCustomerInfo() +"내실 금액은" +price + "원 입니다.");
		
        // 가상메서드
		Customer vc = new VIPCustomer(12345, "noname");
		System.out.println(vc.showCustomerInfo() + price);
		System.out.println(vc.calcPrice(1000));
		
	}
}

이순신님의 등급은 SILVER이며, 보너스 포인트는1010입니다.내실 금액은1000원 입니다.
김유신님의 등급은 VIP이며, 보너스 포인트는10050입니다.내실 금액은900원 입니다.
noname님의 등급은 VIP이며, 보너스 포인트는0입니다.900
900

  • Customer vc = new VIPCustomer();
  • vc 변수의 타입은 Customer지만 인스턴스의 타입은 VIPCustomer
  • 자바에서는 항상 인스턴스의 메서드가 호출 됨 (가상메서드의 원리)
  • 자바의 모든 메서드는 가상 메서드(virtual method)

메서드 오버로딩(method overloading)

서로 다른 매개변수 형식을 가지고 있는 메서드를 여러 개 정의하는 것.
보통 하나의 메서드로 하나의 기능만 구현하지만
하나의 메서드로 여러 기능을 구현하기 때문에 붙여진 이름이다.

오버로딩의 조건

  • 메서드의 이름이 같아야 한다.
  • 메서드의 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
  • 매개변수의 개수 or 매개변수의 자료형이 달라야 한다.
	void human() {
		System.out.println("파라미터 0개");
	}
	void human(int a) {
		System.out.println("파라미터 1개");
	}
	void human(int a, int b) {
		System.out.println("파라미터 2개");
	}
	void human(String a, String b) {
		System.out.println("파라미터 2개");
	}
	void human(int a, String b, String c) {
		System.out.println("파라미터 3개");
	}
	void human(int a, String c) {
		System.out.println("파라미터 2개");
	}

오버로딩 vs 오버라이딩

오버로딩(overriding) :

  • 부모클래스의 메소드를 자식클래스에서 재정의 하여 사용한다.
  • 부모클래스의 메소드의 내부로직을 아예 바구거나 로직을 추가할 때 사용한다.
  • 메소드의 이름과 매개변수의 개수, 데이터타입, 순서와 리턴 타입이 같아야한다.

오버라이딩(overloading) :

  • 동일한 이름으로 다양한 매개변수와 리턴타입의 여러 메소드를 정의하는것.
  • 라이딩과 로딩을 구분하기 쉬운 방법은 매개변수로 확인하는 것 이다.
    매개변수가 같은데 내부 로직이 다르면 라이딩!
    매개변수가 다르면 로딩!!

0개의 댓글