2023. 1. 30. 14:37ใJAVA/Effective JAVA
item11. equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hashcode๋ ์ฌ์ ์ํ๋ผ.
hashCode ์์ฑํ๋ ๋ฐฉ๋ฒ
@Override
public int hashCode()
{
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
1๏ธโฃ int ๋ณ์ result๋ฅผ ์ ์ธํ ํ ๊ฐ c๋ก ์ด๊ธฐํํ๋ค. ์ด๋ c๋ ํด๋น ๊ฐ์ฒด์ ์ฒซ๋ฒ์งธ ํต์ฌ ํ๋๋ฅผ ๋จ๊ณ 2๏ธโฃ.a๋ฐฉ์์ผ๋ก ๊ณ์ฐํ ํด์์ฝ๋์ด๋ค.
(ํต์ฌํ๋๋ equals ๋น๊ต์ ์ฌ์ฉ๋๋ ํ๋)
2๏ธโฃ ํด๋น ๊ฐ์ฒด์ ๋๋จธ์ง ํต์ฌ ํ๋ f ๊ฐ๊ฐ์ ๋ํด ๋ค์ ์์ ์ ์ํํ๋ค.
a. ํด๋น ํ๋์ ํด์์ฝ๋ c๋ฅผ ๊ณ์ฐํ๋ค.
1. ๊ธฐ๋ณธ ํ์
ํ๋๋ผ๋ฉด Type.hashCode(f)๋ฅผ ์ํํ๋ค. ์ฌ๊ธฐ์ Type์ ํด๋น ๊ธฐ๋ณธ ํ์
์ ๋ฐ์ฑ ํด๋์ค์ด๋ค.
2. ์ฐธ์กฐ ํ์
ํ๋๋ฉด์ ์ด ํด๋์ค์ equals ๋ฉ์๋๊ฐ ์ด ํ๋์ equals๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด ๋น๊ตํ๋ค๋ฉด, ์ด ํ๋์ hashCode๋ฅผ ์ฌ๊ท ์ ์ผ๋ก ํธ์ถํ๋ค. ํ๋์ ๊ฐ์ด null์ด๋ฉด 0์ ์ฌ์ฉํ๋ค.
3. ํ๋๊ฐ ๋ฐฐ์ด์ด๋ผ๋ฉด, ํต์ฌ ์์ ๊ฐ๊ฐ์ ๋ณ๋ ํ๋์ฒ๋ผ ๋ค๋ฃฌ๋ค. ์ด์์ ๊ท์น์ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํด ํต์ฌ ์์์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ ๋ค ์, ๋จ๊ณ 2๏ธโฃ.b ๋ฐฉ์์ผ๋ก ๊ฐฑ์ ํ๋ค. ๋ฐฐ์ด์ ํต์ฌ ์์๊ฐ ํ๋๋ ์๋ค๋ฉด ๋จ์ํ ์์ 0์ ์ถ์ฒํ๋ค. ๋ชจ๋ ์์๊ฐ ํต์ฌ ์์๋ผ๋ฉด Arrays.hashCode๋ฅผ ์ฌ์ฉํ๋ค.
b. ๋จ๊ณ 2๏ธโฃ.a ์์ ๊ณ์ฐํ ํด์์ฝ๋ c๋ก result๋ฅผ ๊ฐฑ์ ํ๋ค.
3๏ธโฃ result๋ฅผ ๋ฐํํ๋ค.
๐ก ๊ณฑํ ์ซ์๋ฅผ 31๋ก ์ ํ ์ด์
31์ด ํ์๋ฉด์ ์์์ด๊ธฐ ๋๋ฌธ์ผ๋ก, ๋ง์ฝ ๊ณฑํ๋ ์ซ์๊ฐ ์ง์์ด๊ณ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ ๋ณด๋ฅผ ์๊ฒ ๋๋ค. (2๋ฅผ ๊ณฑํ๋ ๊ฒ์ ์ํํธ ์ฐ์ฐ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๊ธฐ ๋๋ฌธ์ด๋ค.)
์์๋ฅผ ๊ณฑํ๋ ์ด์ ๋ ์ ํต์ ์ผ๋ก ์์๋ฅผ ๊ณฑํด์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒฐ๋ก ์ 31์ ๊ณฑํ๋ฉด ์ํํธ ์ฐ์ฐ๊ณผ ๋บ์ ์ผ๋ก ๋์ฒดํด ์ต์ ํํ ์ ์๋ค.
(๋ค๋ฅธ ์ซ์ ๋ง 37 ์ด๋ฐ๊ฑฐ๋ก ํ๋ค๊ณ ํด์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ฑฐ๋ ํ์ง๋ ์๋๋ค.)
๋ฐฉ๋ฒ1)
@Override
public int hashCode()
{
int result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
return result;
}
-> ์ ํ์ ์ผ๋ก ์์ฑํ๋ hashCode() ์ด๋ค.
๋ฐฉ๋ฒ2)
@Override
public int hashCode()
{
return Objects.hash(areaCode, prefix, lineNum);
}
-> Objects ํด๋์ค๋ ์์์ ๊ฐ์๋งํผ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด์ฃผ๋ ์ ์ ๋ฉ์๋์ธ hash๋ฅผ ์ ๊ณตํ๋๋ฐ ์ด ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ํ์ค๋ก hashCode ํจ์๋ฅผ ์์ฑํ ์ ์๋ค.
ํ์ง๋ง ์์ ์ฝ๋์ ๋นํ๋ฉด ์๋๊ฐ ๋ ๋๋ฆฌ๋ค๊ณ ํ๋ค. (์ ๋ ฅ ์ธ์๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด์ด ๋ง๋ค์ด์ง๊ณ , ์ ๋ ฅ ์ค ๊ธฐ๋ณธ ํ์ ์ด ์๋ค๋ฉด ๋ฐ์ฑ๊ณผ ์ธ๋ฐ์ฑ๋ ๊ฑฐ์ณ์ผ ํ๊ธฐ ๋๋ฌธ)
์ด ๋ฐฉ๋ฒ์ ์ธํ ๋ฆฌ์ ์ด์ ๋์์ ๋ฐ์ ํด์์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ฑ์ฅ?ํ๋ ์ฝ๋์ด๊ธฐ๋ ํ๋ค.
๋ฐฉ๋ฒ3)
private int hashCode; // ์๋์ผ๋ก 0์ผ๋ก ์ด๊ธฐํ๋๋ค.
@Override
public int hashCode()
{
int result = hashCode;
if (result == 0) {
result = Short.hashCode(areaCode);
result = 31 * result + Short.hashCode(prefix);
result = 31 * result + Short.hashCode(lineNum);
hashCode = result;
}
return result;
}
ํด๋์ค๊ฐ ๋ถ๋ณ์ด๊ณ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด, ๋งค๋ฒ ์๋ก ๊ณ์ฐํ๊ธฐ ๋ณด๋ค๋ ์บ์ฑํ๋ ๋ฐฉ์์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ด ํ์ ์ ๊ฐ์ฒด๊ฐ ์ฃผ๋ก ํด์์ ํค๋ก ์ฌ์ฉ๋ ๊ฒ ๊ฐ๋ค๋ฉด ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ง ๋ ํด์์ฝ๋๋ฅผ ๊ณ์ฐํด๋ฌ์ผ ํ๋ค.
ํด์์ ํค๋ก ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด hashCode๊ฐ ์ฒ์ ๋ถ๋ฆด ๋ ๊ณ์ฐํ๋ ์ง์ฐ ์ด๊ธฐํ ์ ๋ต์ ์ฌ์ฉํ ์๋ ์๋ค.
(๋์ ์ด ๋ฐฉ๋ฒ์ ์ค๋ ๋ ์์ ์ฑ์ ์ ๊ฒฝ์จ์ผ ํ๋ค.)
hashCode ์์ฑ ์ฃผ์์ฌํญ
- ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด? ํด์ ์ฝ๋๋ฅผ ๊ณ์ฐํ ๋ ํต์ฌ ํ๋๋ฅผ ์๋ตํด์๋ ์๋๋ค.
: ์๋๋ ๋นจ๋ผ์ง ์ ์์ง๋ง, ํด์ ํ์ง์ด ๋๋น ์ ธ ํด์ ํ ์ด๋ธ์ ์ฑ๋ฅ์ ์ฌ๊ฐํ๊ฒ ๋จ์ด๋จ๋ฆด ์๋ ์๋ค.
- hashCode๊ฐ ๋ฐํํ๋ ๊ฐ์ ์์ฑ ๊ท์น์ API ์ฌ์ฉ์์๊ฒ ์์ธํ ๊ณตํํ์ง ๋งํ์ผ ํ๋ค.
๐๐
equals๋ฅผ ์ฌ์ ์ํ ๋๋ hashCode๋ ๋ฐ๋์ ์ฌ์ ์ํด์ค์ผ ํ๋ค.
๋ง์ฝ ์ฌ์ ์ํ์ง ์๋๋ค๋ฉด ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค.
์๋ก ๋ค๋ฅธ ์ธ์คํด์ค๋ผ๋ฉด ๋๋๋ก ํด์์ฝ๋๋ ์๋ก ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ equals์ hashCode๋ฅผ ์ข ๋ ํธ๋ฆฌํ๊ฒ ์์ฑํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Lombok์ด ์๋ค.
Lombok์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ํด๋น ์ฝ๋๋ค์ ์์ฑํด์ค๋ค.