상위 클래스에 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우 하위 클래스에서 이 메서드를 재정의할 수 있습니다.
이를 메서드 오버라이딩(method overriding)이라고 합니다.
애노테이션(Annotation) : 주석, 주해
형식 : @이름 - 정보전달
@Override : 재정의된 메서드임을 컴파일러에게 알려주는 정보.
public class Parent {
public void move(){
System.out.println("child!");
}
}
public class Child extends Parent{
public void move(){
System.out.println("child!");
}
}
public class Ex01 {
public static void main(String[] args) {
Parent p = new Child();
p.move(); //child출력
}
}
상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정됩니다.
선언한 클래스형이 아닌 생성된 인스턴스의 메서드를 호출하는 것, 이렇게 메서드가 호출되는 기술을 '가상 메서드(virtual method)'라 합니다.
다형성의 원리가 적용될 수 있는 멤버 함수(메서드)로써 동적 바인딩으로 처리되는 메서드를 의미
동적 바인딩 수행 시 가상 메서드 테이블을 참조하여 매핑함
자바의 클래스는 멤버변수와 메서드로 이루어져 있습니다. 클래스를 생성하여 인스턴스가 만들어 지면 멤버변수는 힙 메모리에 위치합니다. 그러나 변수가 사용하는 메모리와 메서드가 사용하는 메모리는 다릅니다.
변수는 인스턴스가 생성될 떄마다 생성되지만 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행합니다.
즉, 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메서드도 여러 개 생성되지 않습니다.

showCustomerInfo()와 같이 재정의되지 않은 메서드인 경우는 메서드 주소가 같으며 상위 클래스의 메서드가 호출됩니다.
그러나, 묵시적 형변환(업캐스팅)과 오버라이딩이 된경우에는 다르다.
