Study/Effective Java
์์ดํ 14. Comparable์ ๊ตฌํํ ์ง ๊ณ ๋ คํ๋ผ
sw_develop
2023. 5. 7. 22:52
๐์ํฉ
public interface Comparable<T> {
int compareTo(T t);
}
- Comparable ์ธํฐํ์ด์ค๋ compareTo() ๋ฉ์๋๋ฅผ ์ ๊ณตํจ
- Comparable์ ๊ตฌํํ๋ค๋ ๊ฒ์ ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ค์๋ ์์ฐ์ ์ธ ์์๊ฐ ์์์ ๋ปํจ --> ํด๋น ์์๋๋ก ์ ๋ ฌ์ด ๊ฐ๋ฅํจ
- ์ํ๋ฒณ, ์ซ์, ์ฐ๋ ๊ฐ์ด ์์๊ฐ ๋ช ํํ ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด ๋ฐ๋์ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์
*compareTo ๋ฉ์๋์ ์ผ๋ฐ ๊ท์ฝ
- equals ๊ท์ฝ๊ณผ ๋๊ฐ์ด ๋ฐ์ฌ์ฑ, ๋์นญ์ฑ, ์ถ์ด์ฑ์ ์ถฉ์กฑํด์ผ ํจ
- ๋ฐ๋ผ์ ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ ๊ตฌ์ฒด ํด๋์ค์์ ์๋ก์ด ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ค๋ฉด compareTo ๊ท์ฝ์ ์งํฌ ๋ฐฉ๋ฒ์ด ์์
- ์ฐํ๋ฒ๋ equals์ ๋์ผํ๊ฒ ํ์ฅํ๋ ๋์ ๋ ๋ฆฝ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์ด ํด๋์ค์ ์๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋จ
๐๋ฐฉ๋ฒ
- Comparable์ ํ์
์ ์ธ์๋ก ๋ฐ๋ ์ ๋ค๋ฆญ ์ธํฐํ์ด์ค์ด๋ฏ๋ก compareTo ๋ฉ์๋์ ์ธ์ ํ์
์ ์ปดํ์ผํ์์ ์ ํด์ง
- ์ ๋ ฅ ์ธ์์ ํ์ ์ ํ์ธํ๊ฑฐ๋ ํ๋ณํํ ํ์์์
- compareTo ๋ฉ์๋๋ ์์๋ฅผ ๋น๊ตํ๋ฏ๋ก ๊ฐ์ฒด ์ฐธ์กฐ ํ๋๋ฅผ ๋น๊ตํ๋ ค๋ฉด compareTo ๋ฉ์๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํด์ผ ํจ
- Comparable์ ๊ตฌํํ์ง ์์ ํ๋๋ ํ์ค์ด ์๋ ์์๋ก ๋น๊ตํด์ผ ํ๋ค๋ฉด Comparator๋ฅผ ๋์ ์ฌ์ฉํจ --> ์ง์ ๋ง๋ค๊ฑฐ๋ ์๋ฐ๊ฐ ์ ๊ณตํ๋ ๊ฒ ์ค์ ์ฌ์ฉ
์ฝ๋ 14-1 ๊ฐ์ฒด ์ฐธ์กฐ ํ๋๊ฐ ํ๋๋ฟ์ธ ๋น๊ต์
public final class CaseInsensitiveString implements Comparable<CaseInsensitiveString> {
public int compareTo(CaseInsensitiveString cis) {
return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);
}
}
- ์๋ฐ 7๋ถํฐ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ํด๋์ค๋ค์ ์ ์ ๋ฉ์๋์ธ compare์ ์ ๊ณตํจ
- compareTo ๋ฉ์๋์์ ๊ด๊ณ ์ฐ์ฐ์ < ์ > ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฐฉ์์ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก, ์ด์ ๋ ์ถ์ฒํ์ง ์์
๋น๊ต์ ์์ฑ ๋ฉ์๋(comparator construction method) ์ฌ์ฉ
- ์๋ฐ 8์์๋ Comparator ์ธํฐํ์ด์ค๊ฐ ๋น๊ต์ ์์ฑ ๋ฉ์๋์ ํจ๊ป ๋ฉ์๋ ์ฐ์ ๋ฐฉ์์ผ๋ก ๋น๊ต์๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์
์ฝ๋ 14-3 ๋น๊ต์ ์์ฑ ๋ฉ์๋๋ฅผ ํ์ฉํ ๋น๊ต์
private static final Comparator<PhoneNumber> COMPARATOR =
comparingInt((PhoneNumber pn) -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
public int compareTo(PhoneNumber pn) {
return COMPARATOR.compare(this, pn);
}
- ํด๋์ค๋ฅผ ์ด๊ธฐํํ ๋ ๋น๊ต์ ์์ฑ ๋ฉ์๋ 2๊ฐ๋ฅผ ์ด์ฉํด ๋น๊ต์๋ฅผ ์์ฑํจ
'๊ฐ์ ์ฐจ'๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌํํ ๋น๊ต์
์ฝ๋ 14-5 ์ ์ compare ๋ฉ์๋๋ฅผ ํ์ฉํ ๋น๊ต์
static Comparator<Object> hashCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2) {
return Integer.compare(o1.hashCode(), o2.hashCode());
}
};
์ฝ๋ 14-6 ๋น๊ต์ ์์ฑ ๋ฉ์๋๋ฅผ ํ์ฉํ ๋น๊ต์
static Comparator<Object> hashCodeOrder = Comparator.comparingInt(o -> o.hashCode());
๐ํต์ฌ ์ ๋ฆฌ
- ์์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด ๊ผญ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํจ
- compareTo ๋ฉ์๋์์ ํ๋์ ๊ฐ ๋น๊ตํ ๋ < ์ > ์ฐ์ฐ์๋ ์ฐ์ง ๋ง์์ผ ํจ
- ๊ทธ ๋์ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ์ ์ compare ๋ฉ์๋๋ Comparator ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ Comparator ์์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์