Burninghering's Blog
article thumbnail

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

오버라이딩(overriding) : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우, 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음

  • 이전 챕터에서, VIPCustomer 클래스의 calcPrice()는 할인율이 적용되지 않음 -> 재정의 하여 구현해야 함
  • 메소드의 정의 부분이 정확히 똑같아야 함!

이클립스에서 제공하는 오버라이딩 기능

VIPCustomer.java

package ch04;

public class VIPcustomer extends Customer {

		double salesRatio;
		String agentID;

		// super를 이용하여 상위 클래스의 생성자 명시적으로 호출
		public VIPcustomer(int customerID, String customerName) {
		super(customerID, customerName);

		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
	}

		@Override //컴파일러에게, 이녀석은 오버라이드 된 메소드라고 알려주는 것!
		public int calcPrice(int price) {
			bonusPoint+=price*bonusRatio;
			price-=(int)(price*salesRatio);
			return price;
		}
		
		
}

VIPcustomer.java

package ch04;

public class VIPcustomer extends Customer {

		double salesRatio;
		String agentID;

		// super를 이용하여 상위 클래스의 생성자 명시적으로 호출
		public VIPcustomer(int customerID, String customerName) {
		super(customerID, customerName);

		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
	}

		@Override //컴파일러에게, 이녀석은 오버라이드 된 메소드라고 알려주는 것!
		public int calcPrice(int price) {
			bonusPoint+=price*bonusRatio;
			price-=(int)(price*salesRatio);
			return price;
		}	
}

 

 

2. @overriding 애노테이션 (annotation)

  • 애노테이션은 원래 "주석"이라는 의미
  • 컴파일러에게 특별한 정보를 제공해주는 역할
  • @overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 남

 

 

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

Customer vc = new VIPCustomer();

vc 변수의 타입은 Customer지만 인스턴스의 타입은 VIPCustomer 이다.

자바에서는 항상 인스턴스의 메서드가 호출 됨 (가상메서드의 원리)

자바의 모든 메서드는 가상 메서드(virtual method) 임

 

충격적인 결과 ... 너 왜 메소드는 인스턴스 따라가니

 

가상 메서드의 원리는 다음 시간에.....

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.