Skip to content

Latest commit

 

History

History
103 lines (72 loc) · 2.5 KB

40_@Override_애너테이션을_일관되게_사용하라_신선영.md

File metadata and controls

103 lines (72 loc) · 2.5 KB

item 40. @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());
  }
}

이 코드를 실행하면 뭐가 나올까?

Set을 사용했으니까 aa ~ zz까지 26이 나오겠군!

Untitled

왜 260이 나올까?

// 뭔가 이상한 equals
public boolean equals(Bigram b) {
  return b.first == first && b.second == second;
}

사실은 equlas는 오버라이딩이 아닌, 오버로딩을 하고 있었다! (인자가 Object가 아닌, Bigram임)

Untitled 1

만약 @Override를 추가했으면 컴파일 단계에서부터 오류를 잡을 수 있었다!

// 정상적인 equals
@Override
public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

⇒ 즉, 이런 실수를 방지하기 위해서는 항상 @Override를 다는 것이 좋다.

예외 사항

추상메소드를 구현할 때를 제외하고는 @Override를 사용하라!

public abstract class Animal {
  public abstract void eat();
}
public class Dog extends Animal {

  // 이번에도 오버로딩을 해보자!
  public void eat(String food) {

  }
}

Untitled 2

추상메서드를 구현하지 않으면 오류가 뜨기 때문이다.

그런데 사실 달아도 된다. 굳이 안 달 이유가 없으니 같이 달자 (사실 IDE에서 알아서 잘 달아준다.)

다시 한 번 한 줄 정리

IDE에서 잘 달아주는 @Override를 굳이 지우지 말자!