-
์์ดํ 14. Comparable์ ๊ตฌํํ ์ง ๊ณ ๋ คํ๋ผDevBook/Effective Java 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 ์์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์
'DevBook > Effective Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ดํ 13. clone ์ฌ์ ์๋ ์ฃผ์ํด์ ์งํํ๋ผ (0) 2023.05.07 ์์ดํ 12. toString์ ํญ์ ์ฌ์ ์ํ๋ผ (0) 2023.05.07 ์์ดํ 11. equals๋ฅผ ์ฌ์ ์ํ๋ ค๊ฑฐ๋ hashCode๋ ์ฌ์ ์ํ๋ผ (0) 2023.05.07 ์์ดํ 10. equals๋ ์ผ๋ฐ ๊ท์ฝ์ ์ง์ผ ์ฌ์ ์ํ๋ผ (0) 2023.05.06 3์ฅ - ๋ชจ๋ ๊ฐ์ฒด์ ๊ณตํต ๋ฉ์๋ (0) 2023.05.06