Item 14. Comparable

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

compareTo๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Comparable์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.(์•ž์˜ clone๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Object๊ฐ€ ์•„๋‹Œ Comparable์— ์„ ์–ธ๋˜์–ด ์žˆ์Œ) Comparable์„ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ค ๊ฐ์ฒด๋“ ์ง€ ์ž์—ฐ์ ์ธ ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.(๋ฐ˜๋Œ€๋กœ ๋งํ•˜๋ฉด, ์ •์˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ํ•„์š”๋กœํ•˜๋Š” TreeMap, TreeSet ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.)

compareTo ์ผ๋ฐ˜ ๊ทœ์•ฝ

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

** sgn ํ‘œ๊ธฐ: ์ˆ˜ํ•™์—์„œ ๋งํ•˜๋Š” ๋ถ€ํ˜ธ ํ•จ์ˆ˜(signum function)๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, -1, 0, 1 ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ •์˜ํ•จ

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))

  • x.compareTo(y) > 0 && y.compareTo(z) > 0์ด๋ฉด x.compareTo(z) > 0

  • x.compareTo(y) == 0์ด๋ฉด sgn(x.compareTo(z)) == sgn(y.compareTo(z))

  • (x.compareTo(y) == 0) == (x.equals(y))(ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ)

compareTo ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด€๊ณ„ ์—ฐ์‚ฐ์ž <, >๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž… ํด๋ž˜์Šค์˜ compare ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.(๊ด€๊ณ„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์˜ค๋ฅ˜๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ์–ด ์ถ”์ฒœํ•˜์ง€ ์•Š์Œ) ๊ทธ๋ฆฌ๊ณ , ํ•ต์‹ฌ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ํ•„๋“œ๋ถ€ํ„ฐ ๋น„๊ตํ•œ ๋’ค ์ˆœ์„œ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„๊ตํ•˜๋Š” ์ผ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

class PhoneNumber implements Comparable<PhoneNumber> {

    // ...

    @Override
    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;
    }
}

์œ„ ๋‚ด์šฉ์„ Java 8 ์ด์ƒ์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์—ฐ์‡„ ๋ฐฉ์‹์œผ๋กœ ๋น„๊ต์ž๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.(์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๋ฏ€๋กœ ๊ถŒ์žฅ)

Last updated

Was this helpful?