오버라이딩, 오버로딩 모두 동일한 메서드명을 다양하게 구현하는 방식이고 OOP의 '다형성'을 구현하는 방법 중 하나이다.
규칙
부모의 메소드와 동일한 리턴 타입, 메소드 이름, 매개 변수 목록 을 가져야 한다.
접근 제한을 더 강하게 재정의할 수 없다.
새로운 예외(Exception)를 throws할 수 없다.
final이 선언된 메소드는 더이상 재정의 할 수 없는 최종 메소드이다.
오버라이딩 하면 부모 객체의 메서드는 숨겨지고, 자식 객체에서 메서드 호출하면 반드시 오버라이딩된 자식 메서드가 호출된다.
자식객체가 자신이 오버라이드한 부모의 메소드를 호출하고 싶으면 'super.메소드()'를 사용한다.
class Parent{
public void call( ){
System.out.println("부모");
}
}
class Child extends Parent{
@Override
public void call( ){
System.out.println("자식");
}
}
public class Override{
public static void main(String[] args) {
Parent p = new Child();
p.call();
}
}
👉 "부모"가 아닌 "자식"이 출력된다
(동적바인딩 : 재정의된 메서드를 먼저 호출하는 규칙)
규칙
parameter의 개수나 타입이 달라야한다.
리턴타입과 함수명은 같아야 한다. (리턴타입이 다른 경우에는 오버로딩이 성립하지 않는다)