did_story

[Java] hashCode()์—์„œ equals()๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผํ•˜๋Š” ์ด์œ  ๋ณธ๋ฌธ

BackEnd๐Ÿƒ/Java

[Java] hashCode()์—์„œ equals()๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผํ•˜๋Š” ์ด์œ 

์–ด์ œ์‹œ์ž‘ 2025. 6. 27. 13:08

equals์™€ hashCode ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๋™๋“ฑ์„ฑ ๋น„๊ต์™€ ํ•ด์‹œ๊ฐ’ ์ƒ์„ฑ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•จ๊ป˜ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ น, ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ(HashSet, HashMap..)์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

equals()๋ž€?

boolean equals(Object obj)๋กœ ์ •์˜๋œ equals() ๋ฉ”์„œ๋“œ == ๋ฅผ ํ†ตํ•ด ๊ฐ์ฑ„์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค) ๋น„๊ตํ•˜์—ฌ 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. equals๊ฐ€ ๊ตฌํ˜„๋œ ๋ฐฉ๋ฒ•์€ 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๋™์ผํ•œ์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” ๋™์ผ์„ฑ(Identity)์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ 2๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์ด ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ธ ๊ฒฝ์šฐ์—๋งŒ ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. - Identity

๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋„์šฐ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ๋™๋“ฑ์„ฑ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋„ ๊ฐ™์ด ํ•˜๋Š” equals() ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค! Object.equals ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด์ง€๋งŒ ๊ฐ๊ฐ์˜ field๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋™๋“ฑ์„ฑ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. - Equality

@Override
public boolean equals(Object object){
		// Identity
		if (this == object) {
		        return true;
		}
	
		if (object == null || getClass() != object.getClass()) return false;
		
		// Equality
		PrivateObject po = (PrivateObject) object;		
		return field1.equals(po.field1) && ... ;
}

equals() ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ์ด์œ ๋Š”?!

Object ํด๋ž˜์Šค์˜ equals() ๋ฉ”์„œ๋“œ๋Š” == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผ์„ฑ์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํด๋ž˜์Šค๋Š” Object ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ๋™์ผ์„ฑ ๋น„๊ต๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™๋“ฑ์„ฑ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•œ ํด๋ž˜์Šค์—์„œ ํ•„์š”์— ๋งž๊ฒŒ equals & hashCode ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HashCode๋ฅผ ์“ธ ๋•Œ equals()๋ฅผ ๊ฐ™์ด ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์ง€ ์•Š์œผ๋ฉด, ์™œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋‚˜์š”?

ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” hashCode ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. hashCode ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์ผ์น˜ํ•œ ์ดํ›„ equals ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’ ์ฐธ์ผ ๋•Œ๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋ผ๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. Object ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ hashCode ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 2๊ฐœ์˜ Object ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ํŒ๋‹จ๋˜์—ˆ๊ณ  HashSet์—์„œ ์ค‘๋ณต ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.