본문 바로가기
Java

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

by 쁘니쁘나 2022. 6. 13.

 

@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

https://88240.tistory.com/450

댓글