JiwonDev

3-1 Equals์™€ toString์˜ ์žฌ์ •์˜

by JiwonDev

# ์–ด๋–จ ๋•Œ Equals ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•ด์•ผ ํ• ๊นŒ?

์‚ฌ์‹ค ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ๊ตณ์ด ์žฌ์ •์˜ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๊ฐ€ ๊ณ ์œ ํ•˜๋‹ค.
    โžก ๊ฐ’(value) ๋Œ€์‹  ๊ณ ์œ ํ•œ ํ™œ์„ฑ ๊ฐœ์ฒด(active entity)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Thread ๊ฐ™์€ ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.
  • ํด๋ž˜์Šค์— "๋…ผ๋ฆฌ์  ๋™์ผ์„ฑ(logical equality)"์„ ๊ฒ€์‚ฌํ•ด์•ผํ•  ํ•„์š”์„ฑ์ด ์—†๋‹ค. 
    โžก ์ผ๋ก€๋กœ java.util.Random ํด๋ž˜์Šค๋Š” ๋‘ Random ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋‚œ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š”์ง€ Equals๋กœ ๊ฒ€์‚ฌํ•  ์ผ์ด ์—†๋‹ค.
  • ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•œ equals๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋„ ์ ๋‹นํ•˜๋‹ค.
  • ํด๋ž˜์Šค๊ฐ€ package-private๋กœ ์„ ์–ธ๋˜์–ด์žˆ๋‹ค๋ฉด equals ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ผ์ด ์—†๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์„ ๋•Œ์—๋Š” ์žฌ์ •์˜ ํ•˜๋Š”๊ฒŒ ๋ฐ”๋žŒ์งํ•˜๋‹ค.

  • ๊ฐ์ฒด ๋™์ผ์„ฑ(object equality)์ด ์•„๋‹Œ ๋…ผ๋ฆฌ์  ๋™์ผ์„ฑ, ๋™๋“ฑ์„ฑ(logical equality)์˜ ๊ฐœ๋…์„ ์ง€์›ํ•˜๋Š” ํด๋ž˜์Šค์ผ ๋•Œ
  • ์ƒ์œ„ ํด๋ž˜์Šค์˜ equals๊ฐ€ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ํ•„์š”๋ฅผ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•  ๋•Œ

 

# ๋‘ ๊ฐ์ฒด๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™๋‹ค๋Š”๊ฑด ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ?

  • โœ”๋ฐ˜์‚ฌ์„ฑ(reflexive): ์ฐธ์กฐ x๊ฐ€ ์žˆ์„ ๋•Œ, x.equals(x)๋Š” true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ชจ๋“  ๊ฐ์ฒด๋Š” ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • โœ”๋Œ€์นญ์„ฑ(symmetric): ์ฐธ์กฐ x์™€ y๊ฐ€ ์žˆ์„ ๋•Œ, ๋‘ ๋น„๊ต๋ฌธ x.equals(y)์™€ y.equals(x)์˜ ๊ฐ’์€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.
  • โœ”์ถ”์ด์„ฑ(transitive): ์ฐธ์กฐ x, y, z๊ฐ€ ์žˆ์„ ๋•Œ, x.equals(y)๊ฐ€ true์ด๊ณ  y.equals(z)๊ฐ€ true์ด๋ฉด x.equals(z)๋„ true์ด๋‹ค.
  • โœ”์ผ๊ด€์„ฑ(consistent): null ์•„๋‹Œ ์ฐธ์กฐ x์™€ y๊ฐ€ ์žˆ์„ ๋•Œ, equals๋ฅผ ํ†ตํ•ด ๋น„๊ต๋˜๋Š” ์ •๋ณด์— ์•„๋ฌด ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค๋ฉด, x.equals(y) ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ถœ ํšŸ์ˆ˜, ์‹œ๊ฐ„์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ์‹ ๋ขฐ์„ฑ์ด ์—†๋‹ค๋ฉด equal๋ฅผ ์žฌ์ •์˜ ํ•˜์ง€๋ง์ž,
  • โœ”๋„(Null)์— ๋Œ€ํ•œ ๋น„ ๋™์น˜์„ฑ(Non-nullity): null ์•„๋‹Œ ์ฐธ์กฐ x์— ๋Œ€ํ•ด์„œ, x.equals(null)์€ ํ•ญ์ƒ false์ด๋‹ค.

 

# ์ฃผ์˜ํ•ด์•ผํ•  ์ 

  • ๋‹น์—ฐํ•œ๊ฑฐ์ง€๋งŒ equals ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋ฅผ Object์˜ ์›ํ˜•์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์ง€๋งˆ๋ผ.
  • equals()๋ฅผ ์žฌ์ •์˜ ํ–ˆ๋‹ค๋ฉด ์ž๋ฐ”์˜ ํด๋ž˜์Šค ๊ทœ์•ฝ์— ๋”ฐ๋ผ ๋ฐ˜๋“œ์‹œ hashCode()๋„ ์žฌ์ •์˜ํ•˜๋ผ.
    โžก Collection๋“ฑ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๊ฐ์ฒด์˜ ๊ณ ์œ ๊ฐ’์ธ hashCode๋ฅผ ๋จผ์ € ๋น„๊ตํ•˜์—ฌ ๋น„๊ต ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ์‹œํ‚จ๋‹ค.
    ๋‹ค๋งŒ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ, ์ฆ‰ equals(Object)๊ฐ€ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•ด์„œ ๋‘ ๊ฐ์ฒด์˜ hashCode์˜ ๊ฐ’์ด ๊ผญ ๋‹ค๋ฅผ ํ•„์š”๋Š” ์—†๋‹ค.

๊ทธ๋Ÿด์ผ์€ ์—†๊ฒ ์ง€๋งŒ. ์„ฑ๋Šฅ์„ ๋†’์ธ๋‹ต์‹œ๊ณ  hashCode๋ฅผ ๋น„๊ตํ•  ๊ฐ์ฒด์˜ ํ•ต์‹ฌํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณ ์œ ํ•œ ์ˆซ์ž๊ฐ’์œผ๋กœ ๋Œ€์ถฉ ๋งŒ๋“ค์—ˆ๋‹ค๊ฐ„, ํ•ด์‹œํ…Œ์ด๋ธ” ์‚ฌ์šฉ์‹œ ํ•ด์‹œ ํ’ˆ์งˆ์ด ๋‚˜๋น ์ ธ ์„ฑ๋Šฅ์„ ๋–จ์–ด๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

2021.07.27 - [๊ธฐ๋ณธ ์ง€์‹/Java ๊ธฐ๋ณธ์ง€์‹] - .equals์™€ .hashCode()๋Š” ํ•ญ์ƒ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผํ•œ๋‹ค.

 

.equals์™€ .hashCode()๋Š” ํ•ญ์ƒ ํ•จ๊ป˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผํ•œ๋‹ค.

Object ๋ฉ”์„œ๋“œ์— ์žˆ๋Š” .hashCode() ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด๋งŒ์˜ ๊ณ ์œ ํ•œ ์ •์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. equals()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•  ๋•Œ์—๋Š” ๋ฐ˜๋“œ์‹œ hashCode()๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋„๋ก ํ•จ๊ป˜ ์˜ค

jiwondev.tistory.com

 

 

# toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ

toString์€ ์ž๋ฐ” ๊ทœ์•ฝ์—์„œ๋„ "์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฝ๋„๋ก ๊ฐ„๋žตํ•˜์ง€๋งŒ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค"๊ณ  ๋ช…์‹œ๋˜์–ด์žˆ๋‹ค.

Object์˜ ๊ธฐ๋ณธ toString์€ ๊ฐ์ฒด์˜ ๊ฒ€์ฆ๋œ ํ’€๋„ค์ž„ (Jenny=PhoneNumber@163b91)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด toString ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด ๋‚ด์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜์ž.

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ