item 14 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ14 Comparable์„ ๊ตฌํ˜„ํ• ์ง€ ๊ณ ๋ คํ•˜๋ผ

public interface Comparable<T> {
    int compareTo(T t);
}
  • compareTo๋Š” ๋‹จ์ˆœ ๋™์น˜์„ฑ ๋น„๊ต์— ๋”ํ•ด ์ˆœ์„œ๊นŒ์ง€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ œ๋„ค๋ฆญํ•˜๋‹ค. Comparable์„ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์—๋Š” ์ž์—ฐ์ ์ธ ์ˆœ์„œ(natural order)๊ฐ€ ์žˆ์Œ์„ ๋œปํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Comparable์„ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์†์‰ฝ๊ฒŒ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
Arrays.sort(a);

compareTo์˜ ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™

์ด ๊ฐ์ฒด์™€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด์˜ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง„ ๊ฐ์ฒด๋ณด๋‹ค ์ž‘์œผ๋ฉด ์Œ์˜ ์ •์ˆ˜๋ฅผ, ๊ฐ™์œผ๋ฉด 0์„, ํฌ๋ฉด ์–‘์˜ ์ •์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ์ฒด์™€ ๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ClassCastException์„ ๋˜์ง„๋‹ค.

์ž‘์„ฑ ์š”๋ น

  1. compareTo ๋ฉ”์„œ๋“œ ์ž‘์„ฑ ์š”๋ น์€ equals์™€ ๋น„์Šทํ•˜๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋œ๋‹ค.
  2. Comparable์€ ํƒ€์ž…์„ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ compareTo ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜ ํƒ€์ž…์€ ์ปดํŒŒ์ผํƒ€์ž„์— ์ •ํ•ด์ง„๋‹ค.
  3. ์ž…๋ ฅ ์ธ์ˆ˜์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํ˜•๋ณ€ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์ธ์ˆ˜์˜ ํƒ€์ž…์ด ์ž˜๋ชป๋๋‹ค๋ฉด ์ปดํŒŒ์ผ ์ž์ฒด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  4. ๋˜ํ•œ 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 ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋น„๊ต์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ