@Override 어노테이션은 상속시에 subtype이 부모 type이 메서드를 덮어씌워서 사용할 때 사용하는 마커 어노테이션이다. 이를 통해 해당 메서드가 override 되었음을 명확히 알 수 있고 실수를 줄일 수 있다. 만약 @Override가 없다면 어떻게 될까?
public class Sample {
private final String sample;
public Sample(String sample) {
this.sample = sample;
}
public String getSample() {
return sample;
}
public String ToSTring() {
return sample;
}
}
위의 코드는 Sample을 만들고 toString을 재정의했다. 얼핏보면 문제가 없어 보인다. 컴파일시에도 문제가 없다. 그러나 테스트 코드를 실행해보자
@Test
void test() {
Sample sample = new Sample("test");
System.out.println(sample);
}
위와 같이 Sample 인스턴스를 하나 만들고 sample의 toString()을 출력하면
다음과 같이 내가 원하는 문자인 test가 아닌 주소가 나온다. 무엇이 문제일까? 위의 코드를 보면 알겠지만 ToSTring()으로 오타가 있고 이는 오버라이드가 아닌 새로운 메서드를 생성한 것이다. 그렇기에 toString()을 오버라이드하지 못한 것이다.
우리는 이를 런타임 단계에서 눈치 챗고 코드에서는 override됬는지 알기가 힘들다.
item39에서 사용한 의도가 거의 비슷한데 @Override로 선언하면 코드 가독성이 향상되고 소스 코드 단계에서 검증가능하기 때문에 컴파일러의 도움을 받을수 있어 오류를 상당히 줄일 수 있다.
상속시에는 @Override 애너테이션을 꼭 사용하자