6.4 메소드 오버라이딩
메소드 오버라이딩
: 자식 클래스가 부모 클래스의 메소드를 자신의 필요에 따라 재정의하는 것이다.
1) 메소드의 이름
2) 매개 변수
3) 반환형
이 동일하여야 한다.
-부모 클래스의 메소드와 자식 클래스의 메소드가 완벽하게 일치하지 않으면
메소드 오버라이딩으로 취급되지 않는다.
=> 이를 방지하기 위해서 메소드 이름 앞에는 @Override 어노테이션을 붙이는 것이 좋다.
< 키워드 super를 사용하여 부모 클래스 멤버 접근 >
-super는 상속 관계에서 부모 클래스의 메소드나 필드를 명시적으로 참조하기 위하여 사용된다.
*부모 클래스가 자동 호출되는 생성자와는 달리,
메소드는 부모 클래스의 것을 호출하려면 super.메소드명()을 작성하여 명시적으로 나타내주어야 한다.
< 오버라이딩 vs 오버로딩 >
•오버로딩 overloading
: 같은 메소드명을 가진 여러 개의 메소드를 작성하는 것.
class Shape {
public void draw() { ... }
public void draw(int x, int y) { ... }
};
-컴파일 시간에서의 다형성을 지원한다.
•오버라이딩 overriding
: 부모 클래스의 메소드를 자식 클래스가 다시 정의하는 것.
class Circle extends Shape {
public void draw() {
"재정의"
}
};
-실행 시간에서의 다형성을 지원할 수 있다.
=> 동적 바인딩
< 정적 메소드를 오버라이드하면 어떻게 될까? >
•인스턴스 메소드
-오버라이드 가능
•정적 메소드
-오버라이드 불가능
-숨김 hiding 이라고 표현
class Animal {
**public static void A()** {
System.out.println("static method in Animal");
}
}
public class Dog extends Animal {
**public static void A()** {
System.out.println("static method in Dog");
}
public static void main(String[] args) {
Dog dog = new dog;
a.A();
dog.A();
}
}
// 실행 결과
static method in Animal
static method in Dog
=> 정적 메소드는 참조 변수의 타입에 따라 호출되는 메서드가 결정된다.
*인스턴스 메소드는 실제 객체의 타입에 따라 호출되는 메서드가 결정되며,
(1) 자식 클래스가 오버라이딩한 경우 무조건 자식 클래스의 메서드를 호출하고,
(2) 자식 클래스가 오버라이딩하지 않은 경우 부모 클래스의 메서드를 호출한다.