๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด equals๋ฅผ ์ฌ์ ์ํ์ง ๋ง์. equlas ๋ฉ์๋๋ ์ฌ์ ์ํ๊ธฐ ์ฌ์ ๋ณด์ด์ง๋ง ๊ณณ๊ณณ์ ํจ์ ์ด ๋์ฌ๋ฆฌ๊ณ ์์ด์ ์์นซํ๋ฉด ๋์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฒ ๊ธ์์๋ 'equals๋ฅผ ์ฌ์ ์ ํ์ง ์์๋ ๋๋ 4๊ฐ์ง ์ํฉ'๊ณผ '๋ง์ฝ equals ์ฌ์ ์๋ฅผ ํด์ผ ํ๋ค๋ฉด, ๋ง์กฑํด์ผ ํ๋ 5๊ฐ์ง ๊ท์ฝ'์ ๋ํด์ ์์๋ณผ ๊ฒ์ด๋ค.
1. ์ฌ์ ์ ํ์ง ์์๋ ๋๋ 4๊ฐ์ง ์ํฉ ๐ฉ
1. ๊ฐ ์ธ์คํด์ค๊ฐ ๋ณธ์ง์ ์ผ๋ก ๊ณ ์ ํ ๊ฒฝ์ฐ ๐ด
์ฑ๊ธํค, ENUM ๋ฑ ๊ฐ ์ธ์คํด์ค๊ฐ ๋ณธ์ง์ ์ผ๋ก ๊ณ ์ ํ ๊ฒฝ์ฐ equals๋ฅผ ์ฌ์ ์ ํ์ง ์์๋ ๋๋ค.
2. ์ธ์คํด์ค์ '๋ ผ๋ฆฌ์ ๋์น์ฑ(logical equality)'์ ๊ฒ์ฌํ ์ผ์ด ์๋ ๊ฒฝ์ฐ ๐ด
์ค๊ณ์๊ฐ ๋ ผ๋ฆฌ์ ๋์น์ฑ ๋ฐฉ์์ ์ํ์ง ์๊ฑฐ๋ ์ ์ด์ ํ์ํ์ง ์๋ค๊ณ ํ๋จํ๋ ๊ฒฝ์ฐ Object์ ๊ธฐ๋ณธ equals๋ฅผ ์ฌ์ฉํ์.
3. ์์ ํด๋์ค์์ ์ฌ์ ์ํ equals๊ฐ ํ์ ํด๋์ค์๋ ๋ฑ ๋ค์ด๋ง๋ ๊ฒฝ์ฐ ๐ด
์๋ฅผ ๋ค์๋ฉด, ๋๋ถ๋ถ์ Set ๊ตฌํ์ฒด๋ AbstractSet์ด ๊ตฌํํ equals๋ฅผ ์์๋ฐ์ ์ฐ๊ณ , List ๊ตฌํ์ฒด๋ค์ AbstractList๋ก๋ถํฐ, Map ๊ตฌํ์ฒด๋ค์ Abstractmap์ผ๋ก๋ถํฐ ์์๋ฐ์ equals๋ฅผ ๊ทธ๋๋ก ์ด๋ค.
4. ํด๋์ค๊ฐ private์ด๊ฑฐ๋ package-private์ด๊ณ equals ๋ฉ์๋๋ฅผ ํธ์ถํ ์ผ์ด ์๋ ๊ฒฝ์ฐ ๐ด
2. equals๋ฅผ ์ฌ์ ์ํ ๋, ๋ง์กฑํด์ผ ํ๋ 5๊ฐ์ง ๊ท์ฝโ
์ฐ์ , equals๋ฅผ ์ฌ์ ์ํด์ผ ํ๋ ์ํฉ์ ์์๋ณด์. ๊ฐ์ฒด ์๋ณ์ฑ(object identity; ๋ ๊ฐ์ฒด๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์๊ฐ)์ด ์๋๋ผ ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ํ์ธํด์ผ ํ๋๋ฐ, ์์ ํด๋์ค์ equals๊ฐ ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ๋น๊ตํ๋๋ก ์ฌ์ ์๋์ง ์์์ ๋ equals๋ฅผ ์ฌ์ ์ ํด์ผ ํ๋ค.
equals ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ ๋๋ ๋ฐ๋์ ์๋์ ์ผ๋ฐ ๊ท์ฝ์ ๋ฐ๋ผ์ผ ํ๋ค.
- ๋ฐ์ฌ์ฑ(reflexivity)
null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x์ ๋ํด, x.equals(x)๋ true๋ค.
A.equals(A) == true - ๋์นญ์ฑ(symmetry)
null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x, y์ ๋ํด, x.equals(y)๊ฐ true๋ฉด y.equals(x)๋ true๋ค.
A.equals(B) == B.equals(A) - ์ถ์ด์ฑ(transitivity)
null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x, y, z์ ๋ํด x.equals(y)๊ฐ true์ด๊ณ y.equals(z)๋ true๋ฉด x.equals(z)๋ true๋ค.
A.equals(B) && B.equals(C), A.equals(C) - ์ผ๊ด์ฑ(consistency)
null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x, y์ ๋ํด, x.equals(y)๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ๋ฉด ํญ์ true๋ฅผ ๋ฐํํ๊ฑฐ๋ ํญ์ false๋ฅผ ๋ฐํํ๋ค.
A.equals(B) == A.equals(B) - null-์๋
null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x์ ๋ํด, x.equals(null)์ false๋ค.
A.equals(null) == false
๋ค์ ๊ธ์์๋ 5๊ฐ์ง ๊ท์ฝ์ ๋ํด์ ์กฐ๊ธ ๋ ์์ธํ๊ฒ ์ดํด๋ณด๋๋ก ํ์.
ํด๋น ๊ธ์ ๋ฐฑ๊ธฐ์ ๋์ '์ดํํฐ๋ธ ์๋ฐ ์๋ฒฝ ๊ณต๋ต'์ ์๊ฐํ๊ณ ์์ฑํ ๊ฒ์ ๋๋ค.