item 40 jihoonKim - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[item40] @Override μ• λ„ˆν…Œμ΄μ…˜μ„ μΌκ΄€λ˜κ²Œ μ‚¬μš©ν•˜λΌ

@OverrideλŠ” λ©”μ„œλ“œ μ„ μ–Έμ—λ§Œ 달 수 있으며, 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ λ‹¬λ Έλ‹€λŠ” 것은 μƒμœ„ νƒ€μž…μ˜ λ©”μ„œλ“€λ₯΄ μž¬μ •μ˜ν–ˆμŒμ„ λœ»ν•œλ‹€.

// μ˜μ–΄ μ•ŒνŒŒλ²³ 2개둜 κ΅¬μ„±λœ λ¬Έμžμ—΄μ„ ν‘œν˜„ν•˜λŠ” 클래슀 - 버그 쑴재
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));
		Sytem.out.println(s.size()); // '260' 좜λ ₯
	}
}
  • λ˜‘κ°™μ€ μ†Œλ¬Έμž 2개둜 κ΅¬μ„±λœ λ°”μ΄κ·Έλž¨ 26개λ₯Ό 10번 λ°˜λ³΅ν•΄ 집합에 μΆ”κ°€ν•œ λ‹€μŒ, κ·Έ μ§‘ν•©μ˜ 크기λ₯Ό 좜λ ₯ν•œλ‹€.
    Set은 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šμ•„ 26이 좜λ ₯될 κ±° κ°™μ§€λ§Œ, μ‹€μ œλ‘œλŠ” 260이 좜λ ₯λœλ‹€.
  • equalsλ₯Ό μž¬μ •μ˜(overriding)ν•œ 게 μ•„λ‹ˆλΌ λ‹€μ€‘μ •μ˜(overloading)λ₯Ό ν•œ 것이닀.
  • Object의 equalsλ₯Ό μž¬μ •μ˜ν•˜λ €λ©΄ 맀개 λ³€μˆ˜ νƒ€μž…μ„ Object둜 ν•΄μ•Όλ§Œ ν–ˆλ‹€.
  • Object의 equalsλŠ” == μ—°μ‚°μžμ™€ 같이 객체 식별성(identity)λ§Œμ„ ν™•μΈν•œλ‹€.
  • 같은 μ†Œλ¬Έμžλ₯Ό μ†Œμœ ν•œ λ°”μ΄κ·Έλž¨ 10개 각각이 μ„œλ‘œ λ‹€λ₯Έ 객체둜 인식
// 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜μ—¬ 잘λͺ»λœ μ½”λ“œμž„μ„ 미리 확인할 수 μžˆλ‹€.
@Override public boolean equals(Bigram b) {
	return b.first == first && b.second == second;
}
// μ˜¬λ°”λ₯΄κ²Œ μˆ˜μ •λœ μ½”λ“œ
@Override public boolean equals(Object o) {
	if (!(o instanceof Bigram))
		return false;
	Bigram b = (Bigram) o;
	return b.first == first && b.second == second;
}

핡심 정리

μƒμœ„ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λ €λŠ” λͺ¨λ“  λ©”μ„œλ“œμ— @Override μ• λ„ˆν…Œμ΄μ…˜μ„ λ‹¬μž. μ»΄νŒŒμΌλŸ¬κ°€ μ—¬λŸ¬λΆ„μ˜ μ‹€μˆ˜λ₯Ό μ•Œλ €μ€„ 것이닀.
μ˜ˆμ™ΈλŠ” ν•œ 가지뿐이닀. ꡬ체 ν΄λž˜μŠ€μ—μ„œ μƒμœ„ 클래슀의 좔상 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  λ•ŒλŠ” 이 μ• λ„ˆν…Œμ΄μ…˜μ„ 달지 μ•Šμ•„λ„ λ˜λ‚˜(이 λ˜ν•œ, μ»΄νŒŒμΌλŸ¬κ°€ μ•Œλ €μ€€λ‹€), 단닀고 ν•΄λ‘œμšΈ 것도 μ—†λ‹€.

⚠️ **GitHub.com Fallback** ⚠️