item 14 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
public interface Comparable<T> {
int compareTo(T t);
}
- compareTo๋ ๋จ์ ๋์น์ฑ ๋น๊ต์ ๋ํด ์์๊น์ง ๋น๊ตํ ์ ์์ผ๋ฉฐ, ์ ๋ค๋ฆญํ๋ค.
Comparable์ ๊ตฌํํ๋ค๋ ๊ฒ์ ๊ทธ ํด๋์ค์ ์ธ์คํด์ค๋ค์๋ ์์ฐ์ ์ธ ์์(natural order)๊ฐ ์์์ ๋ปํ๋ค.
๊ทธ๋์ Comparable์ ๊ตฌํํ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ๋ค์์ฒ๋ผ ์์ฝ๊ฒ ์ ๋ ฌํ ์ ์๋ค.
Arrays.sort(a);
์ด ๊ฐ์ฒด์ ์ฃผ์ด์ง ๊ฐ์ฒด์ ์์๋ฅผ ๋น๊ตํ๋ค. ์ด ๊ฐ์ฒด๊ฐ ์ฃผ์ด์ง ๊ฐ์ฒด๋ณด๋ค ์์ผ๋ฉด ์์ ์ ์๋ฅผ, ๊ฐ์ผ๋ฉด 0์, ํฌ๋ฉด ์์ ์ ์๋ฅผ ๋ฐํํ๋ค. ์ด ๊ฐ์ฒด์ ๋น๊ตํ ์ ์๋ ํ์ ์ ๊ฐ์ฒด๊ฐ ์ฃผ์ด์ง๋ฉด ClassCastException์ ๋์ง๋ค.
- compareTo ๋ฉ์๋ ์์ฑ ์๋ น์ equals์ ๋น์ทํ๋ค. ๋ช ๊ฐ์ง ์ฐจ์ด์ ๋ง ์ฃผ์ํ๋ฉด ๋๋ค.
- Comparable์ ํ์ ์ ์ธ์๋ก ๋ฐ๋ ์ ๋ค๋ฆญ ์ธํฐํ์ด์ค์ด๋ฏ๋ก compareTo ๋ฉ์๋์ ์ธ์ ํ์ ์ ์ปดํ์ผํ์์ ์ ํด์ง๋ค.
- ์ ๋ ฅ ์ธ์์ ํ์ ์ ํ์ธํ๊ฑฐ๋ ํ๋ณํํ ํ์๊ฐ ์๋ค๋ ๋ป์ด๋ค. ์ธ์์ ํ์ ์ด ์๋ชป๋๋ค๋ฉด ์ปดํ์ผ ์์ฒด๊ฐ ๋์ง ์๋๋ค.
- ๋ํ null์ ์ธ์๋ก ๋ฃ์ด ํธ์ถํ๋ฉด NullPointerException์ ๋์ ธ์ผ ํ๋ค. ๋ฌผ๋ก ์ค์ ๋ก๋ ์ธ์(์ด ๊ฒฝ์ฐ null)์ ๋ฉค๋ฒ์ ์ ๊ทผํ๋ ค๋ ์๊ฐ ์ด ์์ธ๊ฐ ๋์ ธ์ง ๊ฒ์ด๋ค.
public final class CaseInsensitiveString
implements Comparable<CaseInsensitiveString> {
public int compareTo(CaseInsensitiveString cis) {
return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);
}
... // ๋๋จธ์ง ์ฝ๋ ์๋ต
}
- CaseInsensitiveString์ ์ฐธ์กฐ๋ CaseInsensitiveString ์ฐธ์กฐ์๋ง ๋น๊ตํ ์ ์๋ค๋ ๋ป์ผ๋ก, Comparable์ ๊ตฌํํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ฅด๋ ํจํด์ด๋ค
// ๊ธฐ๋ณธ ์คํ์ผ
public int compareTo(PhoneNumber pn) {
int result = Short.compare(areaCode, pn.areaCode); // ๊ฐ์ฅ ์ค์ํ ํ๋
if (result == 0) {
result = Short.compare(prefix, pn.prefix); // ๋ ๋ฒ์งธ๋ก ์ค์ํ ํ๋
if (result == 0)
result = Short.compare(lineNum, pn.lineNum); // ์ธ ๋ฒ์งธ๋ก ์ค์ํ ํ๋
}
return result;
}
// ์๋ฐ8 ์คํ์ผ
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);
}
- ์๋ฐ8 ์คํ์ผ์ด ๊ฐ๋ ์ฑ์ด ๋ค์ ๊ฐ์ ๋๋ ๊ธฐ๋ณธ ์คํ์ผ์ ๋นํด ์ฑ๋ฅ์ด ๋๋ฆด ์ ์๋ค.
์์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค๋ฉด ๊ผญ Comparable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ, ๊ทธ ์ธ์คํด์ค๋ค์ ์ฝ๊ฒ ์ ๋ ฌํ๊ณ , ๊ฒ์ํ๊ณ , ๋น๊ต ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ปฌ๋ ์ ๊ณผ ์ด์ฐ๋ฌ ์ง๋๋ก ํด์ผ ํ๋ค. compareTo ๋ฉ์๋์์ ํ๋์ ๊ฐ์ ๋น๊ตํ ๋ <์ > ์ฐ์ฐ์๋ ์ฐ์ง ๋ง์์ผ ํ๋ค. ๊ทธ ๋์ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ํด๋์ค๊ฐ ์ ๊ณตํ๋ ์ ์ compare ๋ฉ์๋๋ Comparator ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ๋น๊ต์ ์์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์.