[ Item 40 ] @Override 애너테이션을 일관되게 사용하라

둥그냥·2022년 5월 8일
0

Effective Java 독서

목록 보기
7/15

📚 @Override 애너테이션을 일관되게 사용하라

  • @Override는 메서드 선언에만 달 수 있다
  • 상위 타입의 메서드를 재정의했음을 뜻한다

버그 예방

@Override 애너테이션을 일관되게 사용하면 여러 가지 악명 높은 버그들을 예방해준다

public class Bigram {
  private final char first;
  private final char second;
  
  public Bigram(char first, char second) {
  	this.first = first;
 	this.second = second;
  }
  public boolean equals(Bigram b) {
  	return b.first == first && b.second == second;
  }
  public int hashCode() {
  	return 31 * first + second;
  }
  
  public static void main(String[] args) {
    Set<Bigram> s = new HashSet<>();
    for (int i = 0; i < 10; i++)
    	for (char ch = 'a'; ch <= 'z'; ch++)
    		s.add(new Bigram(ch, ch));
    System.out.println(s.size());
  }
}

'재정의'를 하려다 실수로 '다중정의'하게 되는 것을 막아준다.

  • equals 메서드를 재정의 하려했으나 매개변수타입을 Objects로 하지 않아 다중정의 되었다.
  • @Override 애너테이션을 달면 컴파일러가 찾아준다
  • 상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 애너테이션을 달자
  • 예외 ) 구체 클래스에서 상위 클래스의 추상메서드를 재정의할 때
    • 아직 구현하지 않은 추상 메서드가 남아 있다면 컴파일러가 그 사실을 바로 알려준다.

IDE

  • IDE는 @Override를 일관되게 사용하도록 부추기기도 한다.
  • IDE에서 관련 설정을 활성화해놓으면 @Override가 달려있지 않은 메서드가 실제로는 재정의했다면 경고를 준다.

Interface 메서드 재정의

  • @Override는 클래스 뿐만 아니라 인터페이스의 메서드를 재정의할 때도 사용할 수 있다.
  • 디폴트 메서드를 지원하기 시작하면서, 인터페이스 메서드를 구현한 메서드에도 @Override를 통해 시그니처가 올바른지 재차 확신할 수 있다.

💡 핵심 정리

  • 재정의한 모든 메서드에 @Override 애너테이션을 의식적으로 달면 여러분이 실수했을때 컴파일러가 바로 알려줄 것이다.
  • 예외는 한 가지뿐이다.
    • 구체 클래스에서 상위 클래스의 추상 메서드를 재정의한 경우엔 이 애너테이션을 달지 않아도 된다.
    • 하지만 단다고 해서 해로울 것도 없다

0개의 댓글