2023. 2. 6. 14:58ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item14. Comparable์ ๊ตฌํํ ์ง ๊ณ ๋ฏผํ๋ผ.
์ ๋ฒ ๊ธ์์๋ Comparable์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ฒซ๋ฒ์งธ๋ก Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ compareTo ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ค๊ณ ํ๋ค.
๐พ ์๋ฐ8์์๋ Comparator ์ธํฐํ์ด์ค๊ฐ ์ผ๋ จ์ ๋น๊ต์ ์์ฑ ๋ฉ์๋(comparator construction method)์ ์ฌ์ฉํด ๋ฉ์๋ ์ฐ์ ๋ฐฉ์์ผ๋ก ๋น๊ต์๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋ค.
-> ์๋ฐ8๋ถํฐ ํจ์ํ ์ธํฐํ์ด์ค, ๋๋ค, ๋ฉ์๋ ๋ ํผ๋ฐ์ค์ Compartor๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ฉ์๋์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ Comparator๋ฅผ ๊ตฌํํ ์ ์๋ค.
Compartor๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
1๏ธโฃ Compartor์ static ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ Comparator ์ธ์คํด์ค ๋ง๋ค๊ธฐ
private static final Comparator<PhoneNumber> COMPARATOR =
2๏ธโฃ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์๋ค๋ฉด default ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฉ์๋ ํธ์ถ ์ด์ด๊ฐ๊ธฐ (๋ฉ์๋ ์ฒด์ด๋)
private static final Comparator<PhoneNumber> COMPARATOR =
Comparator.comparingInt((PhoneNumber pn) -> pn.areaCode)
.thenComparing(pn -> pn.prefix)
.thenComparing(pn -> pn.lineNum);
-> ์ด ์ฝ๋๋ ๋น๊ต์ ์์ฑ ๋ฉ์๋ 2๊ฐ๋ฅผ ์ด์ฉํด ๋น๊ต์๋ฅผ ์์ฑํ๋ค.
๋จผ์ comparingInt๋ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ int ํ์ ํค์ ๋งคํํ๋ ํค ์ถ์ถ ํจ์(key extractor function)๋ฅผ ์ธ์๋ก ๋ฐ์, ๊ทธ ํค๋ฅผ ๊ธฐ์ค์ผ๋ก ์์๋ฅผ ์ ํ๋ ๋น๊ต์๋ฅผ ๋ฐํํ๋ ์ ์ ๋ฉ์๋๋ค.
์ฌ๊ธฐ์๋ PhoneNumber์์ ์ถ์ถํ ์ง์ญ ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํ๋ฒํธ์ ์์๋ฅผ ์ ํ๋ Compartor<PhoneNumber>๋ฅผ ๋ฐํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ ํ๋ฒํธ์ ์ง์ญ ์ฝ๋๊ฐ ๊ฐ์ ์ ์์ผ๋ ๋น๊ต ๋ฐฉ์์ ๋ ๋ค๋ฌ๊ธฐ ์ํด์ ๋๋ฒ์งธ ๋น๊ต์ ์์ฑ ๋ฉ์๋ thenComparingInt๊ฐ ์ํํ๋ค. thenComparingInt๋ Comparator์ ์ธ์คํด์ค ๋ฉ์๋๋ก, int ํค ์ถ์ถ์ ํจ์๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ค์ ๋น๊ต์๋ฅผ ๋ฐํํ๋ค.
3๏ธโฃ static ๋ฉ์๋์ default ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ๋๋ค ํํ์ ๋๋ ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
@Override
public int compareTo(PhoneNumber pn)
{
return COMPARATOR.compare(this, pn);
}
๐ฉ๐ป ๊ฒฐ๋ก
์์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด ๊ผญ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๊ทธ ์ธ์คํด์ค๋ค์ ์ฝ๊ฒ ์ ๋ ฌํ๊ณ , ๊ฒ์ํ๊ณ , ๋น๊ต ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ปฌ๋ ์ ๊ณผ ์ด์ฐ๋ฌ์ง๋๋ก ํด์ผํ๋ค!!