item 10 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 10๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
๋ฌธ์ ๋ฅผ ํํผํ๋ ๊ฐ์ฅ ์ฌ์ด ๊ธธ์ ์์ ์ฌ์ ์ํ์ง ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฅ ๋๋ฉด ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ ์ค์ง ์๊ธฐ ์์ ๊ณผ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์์์ ์ด๊ฑฐํ ์ํฉ ์ค ํ๋์ ํด๋นํ๋ค๋ฉด ์ฌ์ ์ํ์ง ์๋ ๊ฒ์ด ์ต์ ์ด๋ค.
- ๊ฐ ์ธ์คํด์ค๊ฐ ๋ณธ์ง์ ์ผ๋ก ๊ณ ์ ํ๋ค. ๊ฐ์ ํํํ๋ ๊ฒ ์๋๋ผ ๋์ํ๋ ๊ฐ์ฒด๋ฅผ ํํํ๋ ํด๋์ค๊ฐ ์ฌ๊ธฐ ํด๋นํ๋ค. Thread๊ฐ ์ข์ ์๋ก, Object์ equals ๋ฉ์๋๋ ์ด๋ฌํ ํด๋์ค์ ๋ฑ ๋ง๊ฒ ๊ตฌํ๋์๋ค.
- ์ธ์คํด์ค์ '๋ ผ๋ฆฌ์ ๋์น์ฑ'์ ๊ฒ์ฌํ ์ผ์ด ์๋ค.
- ์์ ํด๋์ค์์ ์ฌ์ ์ํ equals๊ฐ ํ์ ํด๋์ค์๋ ๋ฑ ๋ค์ด๋ง๋๋ค. ์์ปจ๋ ๋๋ถ๋ถ์ Set ๊ตฌํ์ฒด๋ AbstractSet์ด ๊ตฌํํ equals๋ฅผ ์์๋ฐ์ ์ฐ๊ณ , List ๊ตฌํ์ฒด๋ค์ AbstractList๋ฅผ ์์๋ฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
- ํด๋์ค๊ฐ private์ด๊ฑฐ๋ package private์ด๊ณ equals ๋ฉ์๋๋ฅผ ํธ์ถํ ์ผ์ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด equals๋ฅผ ์ฌ์ ์ํด์ผ ํ ๋๋ ์ธ์ ์ผ๊น?
๊ฐ์ฒด ์๋ณ์ฑ(๋ ๊ฐ์ฒด๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์๊ฐ)์ด ์๋๋ผ ๋ ผ๋ฆฌ์ ๋์น์ฑ์ ํ์ธํด์ผ ํ ๋๋ค. ๋ ๊ฐ ๊ฐ์ฒด๋ฅผ equals๋ก ๋น๊ตํ๋ ํ๋ก๊ทธ๋๋จธ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์์ง๊ฐ ์๋๋ผ ๊ฐ์ด ๊ฐ์์ง๋ฅผ ์๊ณ ์ถ์ด ํ ๊ฒ์ด๋ค.
๊ฐ ํด๋์ค๋ผ ํด๋ ๊ฐ์ด ๊ฐ์ ์ธ์คํด์ค๊ฐ ๋ ์ด์ ๋ง๋ค์ด์ง์ง ์์์ ๋ณด์ฅํ๋ ์ธ์คํด์ค ํต์ ํด๋์ค๋ผ๋ฉด equals๋ฅผ ์ฌ์ ์ํ์ง ์์๋ ๋๋ค.
equals ๋ฉ์๋๋ ๋์น๊ด๊ณ๋ฅผ ๊ตฌํํ๋ฉฐ ๋ค์์ ๋ง์กฑํ๋ค.
- ๋ฐ์ฌ์ฑ : null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x์ ๋ํด, x.equals(y)๋ true๋ค.
- ๋์น์ฑ : null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x, y์ ๋ํด x.equals(y)๊ฐ true๋ฉด y.euqls(x)๋ true๋ค.
- ์ถ์ด์ฑ : null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x,y,z์ ๋ํด x.equals(y)๊ฐ true์ด๊ณ y.equals(z)๋ true์ด๋ฉด x.equals(z)๋ true์ด๋ค.
- ์ผ๊ด์ฑ : null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x,y์ ๋ํด x.equals(y)๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ๋ฉด ํญ์ true๋ฅผ ๋ฐํํ๊ฑฐ๋ ํญ์ false๋ฅผ ๋ฐํํ๋ค.
- null ์๋ : null์ด ์๋ ๋ชจ๋ ์ฐธ์กฐ ๊ฐ x์ ๋ํด x.equals(null)์ false๋ค.
์ด ๊ท์ฝ์ ์ด๊ธฐ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ด์ํ๊ฒ ๋์ํ๊ฑฐ๋ ์ข ๋ฃ๋ ๊ฒ์ด๊ณ , ์์ธ์ด ๋๋ ์ฝ๋๋ฅผ ์ฐพ๊ธฐ๋ ๊ต์ฅํ ์ด๋ ค์ธ ๊ฒ์ด๋ค.
์์ ์กฐ๊ฑด์ ํ ๋๋ก ์์ง์ equals ๋ฉ์๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ๋ค.
- == ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ์ด ์๊ธฐ ์์ ์ ์ฐธ์กฐ ์ธ์ง ํ์ธํ๋ค.
- instanceof ์ฐ์ฐ์๋ก ์ ๋ ฅ์ด ์ฌ๋ฐ๋ฅธ ํ์ ์ธ์ง ํ์ธํ๋ค. ์ด๋์ ์ฌ๋ฐ๋ฅธ ํ์ ์ equals๊ฐ ์ ์๋ ํด๋์ค์ธ ๊ฒ์ด ๋ณดํต์ด์ง๋ง, ๊ฐ๋์ ๊ทธ ํด๋์ค๊ฐ ๊ตฌํํ ํน์ ์ธํฐํ์ด์ค๊ฐ ๋ ์๋ ์๋ค.
- ์ ๋ ฅ์ ์ฌ๋ฐ๋ฅธ ํ์ ์ผ๋ก ํ๋ณํํ๋ค. ์์ 2๋ฒ์์ instanceof๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ด ๋จ๊ณ๋ 100% ์ฑ๊ณตํ๋ค.
- ์ ๋ ฅ ๊ฐ์ฒด์ ์๊ธฐ ์์ ์ ๋์๋๋ 'ํต์ฌ' ํ๋๋ค์ด ๋ชจ๋ ์ผ์นํ๋์ง ํ๋์ฉ ๊ฒ์ฌํ๋ค.
- ์ด๋ค ํ๋๋ฅผ ๋จผ์ ๋น๊ตํ๋๋๊ฐ equals์ ์ฑ๋ฅ์ ์ข์ฐํ๊ธฐ๋ ํ๋ค. ์ต์์ ์ฑ๋ฅ์ ๋ฐ๋๋ค๋ฉด ๋ค๋ฅผ ๊ฐ๋ฅ์ฑ์ด ๋ ํฌ๊ฑฐ๋ ๋น๊ตํ๋ ๋น์ฉ์ด ์ผ ํ๋๋ฅผ ๋จผ์ ๋น๊ตํ์
- equals๋ฅผ ์ฌ์ ์ํ ๋ hashCode๋ ๋ฐ๋์ ์ฌ์ ์ํ์(์์ดํ 11 ์ฐธ๊ณ )
- Object ์ธ์ ํ์ ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ equals ๋ฉ์๋๋ ์ ์ธํ์ง ๋ง์. ์ด ๋ฉ์๋๋ Object.equals๋ฅผ ์ฌ์ ์ํ ๊ฒ ์๋๋ค. ์ ๋ ฅ ํ์ ์ด Object๊ฐ ์๋๋ฏ๋ก ์ฌ์ ์๊ฐ ์๋๋ผ ๋ค์ค์ ์ ํ๊ฒ์ด๋ค.
equals๋ฅผ ์์ฑํ๊ณ ํ ์คํธํ๋ ์ผ์ ์ง๋ฃจํ๊ณ ์ด๋ฅผ ํ ์คํธํ๋ ์ฝ๋๋ ํญ์ ๋ปํ๋ค. ๋คํํ ์ด ์์ ์ ๋์ ํด์ค ์คํ์์ค๊ฐ ์์ผ๋ ๋ฐ๋ก ๊ตฌ๊ธ์ด ๋ง๋ AutoValue ํ๋ ์์ํฌ๋ค. ํด๋์ค์ ์ ๋ํ ์ด์ ํ๋๋ง ์ถ๊ฐํ๋ฉด AutoValue๊ฐ ์ด ๋ฉ์๋๋ค์ ์์์ ์์ฑํด์ฃผ๋ฉฐ, ์ง์ ์์ฑํ๋ ๊ฒ๊ณผ ๊ทผ๋ณธ์ ์ผ๋ก ๋๊ฐ์ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ค ๊ฒ์ด๋ค.
๊ตฌ๊ธ AutoValue ์ ๋ ธํ ์ด์ ์์ ํ์
์ ๋ฆฌ
๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด equals๋ฅผ ์ฌ์ ์ํ์ง ๋ง์. ๋ง์ ๊ฒฝ์ฐ์ Object์ equals๊ฐ ์ฌ๋ฌ๋ถ์ด ์ํ๋ ๋น๊ต๋ฅผ ์ ํํ ์ํํด์ค๋ค. ์ฌ์ ์ํด์ผ ํ ๋๋ ๊ทธ ํด๋์ค์ ํต์ฌ ํ๋๋ชจ๋๋ฅผ ๋น ์ง์์ด, ๋ค์ฏ ๊ฐ์ง ๊ท์ฝ์ ํ์คํ ์ง์ผ๊ฐ๋ฉฐ ๋น๊ตํด์ผ ํ๋ค.