커버리지란 무엇입니까?
재정의는 기존 상속된 메서드를 클래스에 맞게 변경(재정의)하는 목적입니다.
보장 조건
- 메서드 매개변수가 일치해야 합니다.
- 반환 유형은 동일해야 합니다.
- 수퍼클래스의 메서드보다 좁은 범위의 액세스 한정자를 사용할 수 없습니다.
- 부모 클래스 메서드보다 더 많은 예외를 선언할 수 없습니다.
@Override를 작성해야 합니까?
상속된 메서드 재정의에 대한 제한 없음
왜 사용합니까?
아래 코드를 확인해보자.
class Parent {
public void hello(String name) {
System.out.println("안녕하세요, 저는 " + name + "입니다.
");
}
}
class Child extends Parent{
// @Override가 있으면 어떻고 없으면 어떤가요?
public void hello() {
System.out.println("안녕!
");
}
}
메서드 이름이 같기 때문에 재정의하는 것처럼 보입니다.
그러나 그것은 압도적이지 않고 과부하입니다.
- 재정의: 동일한 선언(반환 유형, 매개변수, 인수)
- 오버로딩: 다른 선언
예상대로 보였으므로 코드를 실행했습니다.
코드를 실행하면 컴파일 단계에서 두 가지 오류가 발생한 것을 확인할 수 있습니다.

첫 번째 실수
Parent 클래스의 Hello()는 다형성을 통해 부모 타입의 인스턴스로 생성되는데, 당연히 재작성이 아닌 오버로드가 되기 때문에 필수 파라미터 타입인 String이 입력되지 않으면 문제가 발생한다.
오버로딩의 경우 완전히 새로운 메서드를 얻게 되므로 자식 인스턴스의 Hello() 메서드를 부모 타입으로 사용할 수 없다.
두 번째 실수
@Override에 대한 오류인데 메소드가 슈퍼타입 클래스에 의해 구현되거나 오버라이드되지 않아서 오류가 발생합니다.
위에서 알 수 있듯이 주석을 사용하는 것은 주석과 동일한 기능일 뿐만 아니라 컴파일 단계에서 오류를 발생시켜 프로그래머의 실수를 방지하는 또 다른 기능이 있습니다.
@Override를 사용하지 않으면 긴 코드 조각을 올바르게 재정의하고 있는지 직접 확인해야 하기 때문에 생산성도 향상됩니다.

@Override 없이도 잘 작동합니다.
하지만 쓰자.