위 코드의 문제점과 결과값이 무엇이 나올지 예측이 되는가? 아마 결과값으로 26이 찍히기를 예상하겠지만 실제로는 260이 찍힌다. 미묘하게 숨어있는 한 가지 문제점 때문이다. 이 문제점은 바로 equals의 오버라이딩에 숨어있다. 프로그래머는 equals 메소드를 오버라이드 할 목적으로 작성했겠지만, equals의 인자를 보면 Object가 아니라 Bigram이다. 즉 , 오버로딩을 한 것이다. 따라서 equals는 Object에 구현되어 있는 equals를 재사용한 것이며, 따라서 결과값이 260이 나오게 된다. 

 다행인 것은 컴파일러가 이런 오류를 찾을 수 있도록 돕는다는 것인데, 이러한 도움을 받기 위해서는 메소드에 @Override 어노테이션을 추가해야 한다.

위와 같이 수정하면, 컴파일러는 오류 메세지를 출력하게 된다. 즉 상위 클래스에 선언된 메서드를 재정의할 때는 반드시 선언부에 Override 어노테이션을 붙혀야 한다는 것이다. 비 abstract클래스에서 abstract 메서드를 재정의할 때는 꼭 @Override 어노테이션을 사용할 필요는 없지만 명시적으로 알리고 싶을 때는 사용해도 무관하다.

하지만 추상 클래스나 인터페이스으 ㅣ경우에는 그 상위 클래스나 상위 인터페이스 메서드를 재정의하는 모든 메서드에, abstract 메서드건 아니건 어노테이션을 붙힐 필요가 있다.

요약

상위 자료형에 선언된 메서드를 재정의하는 모든 메서드에 Override 어노테이션을 붙이도록 하면 굉장히 많은 오류를 막을 수 있다. 예외적으로, 비-abstract 클래스에서 상위 클래스의 abstract 메서드를 재정의 할 때는 Override 어노테이션을 붙이지 않아도 된다.



+ Recent posts