@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 11 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());
}
}
a~z 까지 26개의 알파벳을 10번 반복해 집합인 Set<Bigram> 에 추가한 다음 그 집합의 크기를 출력하는 예제이다. Set 은 중복을 허용하지 않으므로 26개가 출력될 것 같지만, 실제로는 260이 출력되었다!!
해당 코드를 작성한 개발자는 equals 메서드를 재정의하려 한 것으로 보이고, 재정의 할 때는 hashCode 도 함께 재정의해야 한다는 사실도 잊지 않았다.
하지만!! equals를 ‘재정의(Overriding)’ 한게 아니라 ‘다중정의(Overloading)’ 해버렸다.
💡여기서!! Overriding과 Overloading 의 차이를 설명하시오. (면접에 잘나옴!!)
오버라이딩 (Overriding)
- 상위 클래스의 메서드를 하위 클래스가 재정의 하는것.
- 메서드의 이름은 물론 파라미터의 갯수나 타입도 동일해야함.
- 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용.
- 즉, 상속 받은 메서드의 내용만 변경
오버로딩 (Overloading)
- 메서드의 이름은 같지만, 파라미터의 갯수나 타입이 다른 함수를 정의하는 것.
- 즉, 기존에 없던 새로운 메서드를 정의
그럼 이제다시 본론으로 돌아와서..!!
Object의 equals 를 재정의 하려면 매개변수 타입을 Object로 해야만 하는데, 그렇게 하지 않았다!
그래서 같은 소문자를 소유한 알파벳 10개가 각각 서로 다른 객체로 인식되고, 결국 260개를 출력하게 된 것이다!
다행히 오류는 컴파일러가 찾아주지만, 그러려면 아래코드처럼 Object.equals를 재정의한다는 의도를 명시해야 한다.
@Override
public boolean equals(Bigram b) {
return b.first = first && b.second = second;
}
그러면 컴파일러가 오류를 발생시켜 알려준다!
Bigram.java:10: method does not override or implement a method from a supertype
@Override public boolean equals(Bigram b) {
^
이렇게 잘못한 부분을 명확히 알려주므로 올바르게 수정할 수 있다.
결론은?
상위 클래스의 메서드를 재정의하려는 모든 메서드에 @Override 에노테이션을 달자!
또한 IDE에서 관련 설정을 활성화 해놓으면 @Override가 달려있지 않는 메서드가 실제로 재정의를 했다면 경고를 주어 알려주니 안심하자.
참고
도서 - Effective Java
'Java' 카테고리의 다른 글
Item34. int 상수 대신 열거 타입을 사용하라. (0) | 2022.06.05 |
---|---|
Item31. 한정적 와일드카드를 사용해 API 유연성을 높이라. (0) | 2022.06.04 |
Item25. 톱레벨 클래스는 한 파일에 하나만 담으라. (0) | 2022.05.24 |
SOLID 좋은 객체지향 설계의 5가지 원칙 (0) | 2022.05.19 |
다형성, 오버라이딩, 오버로딩 (0) | 2022.05.19 |
댓글