메서드 재정의하기 - 오버라이딩
-
상위 클래스에 정의된 메서드의 구현 내용을 하위 클래스에서 구현할 내용과 맞게 동일한 이름의 메서드로 재정의 할 수 있다
-
반환값, 메서드 이름, 매개변수의 타입과 개수가 똑같아야한다(다를 경우 다른 메서드로 판단)
-
위 예제에서 VIP의 가격을 계산하는 메서드 재정의
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusPoint;
price -= (int)(price * salesRatio);
return price;
}
- 그냥 customer로 정의된 고객이 호출한 calcPrice 메서드는 재정의 전의 메서드이고
VIPCustomer로 정의된 고객이 호출한 calcPrice는 재정의 된 메서드이다
그렇다면 Customer타입에 VIP생성자로 생성된 고객은? (인스턴스는 VIPCustomer, 변수의 타입은 Customer)
변수. 하면 Customer의 것들이 보인다
하지만 재정의된 calcPrice가 사용된다
자바에서는 항상 인스턴스의 메서드가 호출 된다
가상 메서드의 원리
자바는 모든 메서드가 가상 메서드다
- 메서드의 이름은 주소값을 나타낸다
- 메서드는 명령어의 set이고 프로그램이 로드되면 메서드 영역(코드영역)에 명령어 set이 위치
- 해당 메서드가 호출되면 명령어 set이 있는 주소를 찾아 명령어가 실행됨
- 메서드에서 사용하는 변수들은 스텍 메모리에 위치하게 된다
- 다른 인스턴스라도 같은 메서드의 코드는 같으므로 같은 메서드가 호출됨
- 인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 set은 처음 한번만 로드된다
- 재정의된 경우 메서드 영역에 재정의된 클래스가 생성되고 함수를 호출하면 재정의 된 함수를 호출한다
애노테이션
- 주석이라는 의미
컴파일러에 정보를 전달하는 역할