위 코드의 문제점과 결과값이 무엇이 나올지 예측이 되는가? 아마 결과값으로 26이 찍히기를 예상하겠지만 실제로는 260이 찍힌다. 미묘하게 숨어있는 한 가지 문제점 때문이다. 이 문제점은 바로 equals의 오버라이딩에 숨어있다. 프로그래머는 equals 메소드를 오버라이드 할 목적으로 작성했겠지만, equals의 인자를 보면 Object가 아니라 Bigram이다. 즉 , 오버로딩을 한 것이다. 따라서 equals는 Object에 구현되어 있는 equals를 재사용한 것이며, 따라서 결과값이 260이 나오게 된다.
다행인 것은 컴파일러가 이런 오류를 찾을 수 있도록 돕는다는 것인데, 이러한 도움을 받기 위해서는 메소드에 @Override 어노테이션을 추가해야 한다.
위와 같이 수정하면, 컴파일러는 오류 메세지를 출력하게 된다. 즉 상위 클래스에 선언된 메서드를 재정의할 때는 반드시 선언부에 Override 어노테이션을 붙혀야 한다는 것이다. 비 abstract클래스에서 abstract 메서드를 재정의할 때는 꼭 @Override 어노테이션을 사용할 필요는 없지만 명시적으로 알리고 싶을 때는 사용해도 무관하다.
하지만 추상 클래스나 인터페이스으 ㅣ경우에는 그 상위 클래스나 상위 인터페이스 메서드를 재정의하는 모든 메서드에, abstract 메서드건 아니건 어노테이션을 붙힐 필요가 있다.
요약
상위 자료형에 선언된 메서드를 재정의하는 모든 메서드에 Override 어노테이션을 붙이도록 하면 굉장히 많은 오류를 막을 수 있다. 예외적으로, 비-abstract 클래스에서 상위 클래스의 abstract 메서드를 재정의 할 때는 Override 어노테이션을 붙이지 않아도 된다.
'개발서적 > 이펙티브자바' 카테고리의 다른 글
[메서드]규칙38. 인자의 유효성을 검사하라 (0) | 2017.05.04 |
---|---|
[열거형과 어노테이션]규칙37. 자료형을 정의할 때 표식 인터페이스를 사용하라 (0) | 2017.05.04 |
[열거형과 어노테이션]작명 패턴 대신 어노테이션을 사용하라 (0) | 2017.05.04 |
[열거형과 어노테이션]규칙34. 확장 가능한 enum을 만들어야 한다면 인터페이스를 이용하라 (0) | 2017.05.04 |
[열거형과 어노테이션]규칙33. ordinal을 배열 첨자로 사용하는 대신 EnumMap을 이요하라 (0) | 2017.05.03 |