๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š์ฝ์€ ์ฑ… ์ •๋ฆฌ/์ดํŽ™ํ‹ฐ๋ธŒ์ž๋ฐ”

[์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”] 3์žฅ : ๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ

๋ชจ๋“  ๊ฐ์ฒด์˜ ๊ณตํ†ต ๋ฉ”์„œ๋“œ

Object๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋จ

Object์—์„œ final์ด ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋‘ ์žฌ์ •์˜๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜์–ด์ง. 

๋”ฐ๋ผ์„œ, ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์•ผ๋งŒ ํด๋ž˜์Šค๊ฐ€ ์˜ค๋™์ž‘ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์•„์ดํ…œ 10 : equals๋Š” ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ง€์ผœ ์žฌ์ •์˜ํ•˜๋ผ

equals ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค์ง! ์ž๊ธฐ์ž์‹ ๋งŒ ๊ฐ™๋‹ค. (๊ฐ์ฒด์‹๋ณ„์„ฑ์œผ๋กœ ๋น„๊ต)

 

  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๊ฐ์ฒด ์‹๋ณ„์ด ์•„๋‹Œ '๋…ผ๋ฆฌ์  ๋™์น˜์„ฑ'์„ ํ™•์ธ ํ•ด์•ผํ•  ๋•Œ
      • ์ฃผ๋กœ ๊ฐ’ ํด๋ž˜์Šค ( new Inteager(2)๋ฅผ ๋‘๋ฒˆํ•˜๋ฉด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋‚˜ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๊ฐ€ ๋œ๋‹ค

์–‘์งˆ์˜ equals ๋ฉ”์„œ๋“œ ๊ตฌํ˜„๋ฐฉ๋ฒ•

1. == ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ์ด ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•œ๋‹ค. (์ž๊ธฐ์ž์‹ ์ด๋ฉด true๋ฐ˜ํ™˜)

2. instanceof ์—ฐ์‚ฐ์ž๋กœ ์ž…๋ ฅ์ด ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์ธ ์ง€ ํ™•์ธํ•œ๋‹ค. 

3. ์ž…๋ ฅ์„ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•œ๋‹ค. -> 2๋ฒˆ๊ณผ์ •์œผ๋กœ ์ธํ•ด ๋ฌด์กฐ๊ฑด ํ˜•๋ณ€ํ™˜ ์„ฑ๊ณต

4. ์ž…๋ ฅ ๊ฐ์ฒด์™€ ๋Œ€์‘๋˜๋Š” ์ž๊ธฐ์ž์‹ ์˜ 'ํ•ต์‹ฌ' ํ•„๋“œ๋“ค์ด ๋ชจ๋‘ ์ผ์น˜ํ•˜๋Š”์ง€ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด true, ์•„๋‹ˆ๋ฉด false ๋ฐ˜ํ™˜

 

# ์œ„์˜ ๋น„๋ฒ•์„ ์ ์šฉํ•œ equals ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์ฝ”๋“œ #

// ์ฝ”๋“œ 10-6 ์ „ํ˜•์ ์ธ equals ๋ฉ”์„œ๋“œ์˜ ์˜ˆ (64์ชฝ)
public final class PhoneNumber {
    private final short areaCode, prefix, lineNum;

    public PhoneNumber(int areaCode, int prefix, int lineNum) {
        this.areaCode = rangeCheck(areaCode, 999, "์ง€์—ญ์ฝ”๋“œ");
        this.prefix   = rangeCheck(prefix,   999, "ํ”„๋ฆฌํ”ฝ์Šค");
        this.lineNum  = rangeCheck(lineNum, 9999, "๊ฐ€์ž…์ž ๋ฒˆํ˜ธ");
    }

    private static short rangeCheck(int val, int max, String arg) {
        if (val < 0 || val > max)
            throw new IllegalArgumentException(arg + ": " + val);
        return (short) val;
    }

    @Override public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof PhoneNumber))
            return false;
        PhoneNumber pn = (PhoneNumber)o;
        return pn.lineNum == lineNum && pn.prefix == prefix
                && pn.areaCode == areaCode;
    }

    // ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ์ƒ๋žต - hashCode ๋ฉ”์„œ๋“œ๋Š” ๊ผญ ํ•„์š”ํ•˜๋‹ค(์•„์ดํ…œ 11)!
}

 

๋งˆ์ง€๋ง‰์œผ๋กœ equals๋ฅผ ์žฌ์ •์˜ํ•  ๋• hascode๋„ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•˜์ž.

 

"ํ•ต์‹ฌ์ •๋ฆฌ"

๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด equals๋ฅผ ์žฌ์ •์˜ํ•˜์ง€๋ง๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ๋น ์ง์—†์ด ์œ„ ํ•ต์‹ฌ๊ทœ์•ฝ์„ ์ง€์ผœ๊ฐ€๋ฉฐ ๋น„๊ตํ•˜์ž

 

์•„์ดํ…œ 11 : equals๋ฅผ ์žฌ์ •์˜ํ•˜๋ ค๊ฑฐ๋“  hasecode๋„ ์žฌ์ •์˜ํ•˜๋ผ

hasecode๋ฅผ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด HashMap์ด๋‚˜ HashSet๊ฐ™์€ ์ปฌ๋ ‰์…˜์˜ ์›์†Œ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

  • ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค. (ํ•˜์ง€๋งŒ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ)

๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์€ ์•„์ดํ…œ10๋ฒˆ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ณ  ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ hasecode๋Š” ์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋ถ€์—ฌ๋˜๋ฏ€๋กœ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ, hascode๋ฉ”์„œ๋“œ๋ฅผ ํ•ต์‹ฌ ํ•„๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ hasecode๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•˜์ž. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋™์น˜์ธ ๊ฐ์ฒด๋Š” ๊ฐ™์€ hasecode๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

    @Override 
    public int hashCode() {
        int result = Short.hashCode(areaCode);
        result = 31 * result + Short.hashCode(prefix);
        result = 31 * result + Short.hashCode(lineNum);
        return result;
    }

์•„์ดํ…œ 12 : toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ

toString์˜ ๊ทœ์•ฝ์€ "๋ชจ๋“  ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ผ" ์ด๋‹ค. toString์€ ๋‹จ์ง€ ํด๋ž˜์Šค์ด๋ฆ„@ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ค„ ๋ฟ ๋ณ„ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜์—ฌ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ์œ ์ตํ•œ ์ •๋ณด๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•œ๋‹ค.

 

toString()์„ ์ž˜ ๊ตฌํ˜„ํ•ด๋‘๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ณ  ๋””๋ฒ„๊น…์— ๋งŽ์€ ๋„์›€์ด ๋œ๋‹ค.

 

๊ตฌํ˜„์‹œ ์‚ฌ์šฉํ•  ํฌ๋ฉง์„ ์ฃผ์„์œผ๋กœ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด์„œ ์„ค๋ช…ํ•ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค์˜ ์ฃผ์š” ์ •๋ณด๋ฅผ ๋ชจ๋“  ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์ƒ์œ„ ํด๋ž˜์Šค์— ์ด๋ฏธ ์•Œ๋งž๊ฒŒ ์ •์˜ํ–ˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์จ๋„ ๋œ๋‹ค.

 

์•„์ดํ…œ 13 : clone ์žฌ์ •์˜๋Š” ์ฃผ์˜ํ•ด์„œ ์ง„ํ–‰ํ•ด๋ผ

๋ฉ”์„œ๋“œ ํ•˜๋‚˜ ์—†๋Š” Cloneable ์ธํ„ฐํŽ˜์ž‡๋Š๋Š” Object์˜ protected ๋ฉ”์„œ๋“œ์ธ clone์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•œ๋‹ค.

(์—ฌ๊ธฐ์„œ๋Š” ์ด๋ก€์ ์œผ๋กœ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘ ๋ฐฉ์‹ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค)

 

Cloneable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” clone๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์ œ๊ณตํ•˜๊ฒŒ ๋˜๊ณ  clone์„ ํ†ตํ•ด ๋ณต์ œ๊ฐ€ ์ œ๋Œ€๋กœ ๋  ๊ฑฐ๋ผ ๊ธฐ๋Œ€ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ํ•ด๋‹นํด๋ž˜์Šค๋‚˜ ์ƒ์œ„ ํด๋ž˜์Šค๋“ค์ด ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ??

 

ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€์ธ ๊ฒฝ์šฐ์—๋Š” clone์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ฐธ์กฐ๊ฐ์ฒด ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋ณต์‚ฌํ•œ ๊ฐ์ฒด๊ฐ€ ๋˜‘๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ค์ง€ ์•Š๋„๋ก ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ•ด์ค˜์•ผํ•œ๋‹ค.

์–ด์ฉ” ์ˆ˜ ์—†์ด cloneable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ๋‹ค๋ฉด clone์„ ์ž˜ ์ž‘๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์€ ์ƒํ™ฉ(cloneable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ƒํ™ฉ)์—์„œ๋Š” '๋ณต์‚ฌ ์ƒ์„ฑ์ž'์™€ '๋ณต์‚ฌ ํŒฉํ„ฐ๋ฆฌ'๋ผ๋Š” ๋” ๋‚˜์€ ๊ฐ์ฒด ๋ณต์‚ฌ ๋ฐฉ์‹์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

public Yum(Yum yum) {...}; // ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž
public static Yum newInstance(Yum yum) {...}; // ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ๋ชจ๋ฐฉํ•œ ์ •์  ํŒฉํ„ฐ๋ฆฌ

์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์€ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์œ„ํ—˜ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

"ํ•ต์‹ฌ ์ •๋ฆฌ"

์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค ์ž‘์„ฑ ์‹œ ์ ˆ๋Œ€ Cloneable ํ™•์žฅํ•˜์ง€ ๋ง๊ณ , ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋„ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ๋ง์ž.

๋ณต์ œ ๊ธฐ๋Šฅ์€ ์ƒ์„ฑ์ž์™€ ํŒฉํ„ฐ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ตœ๊ณ ๋‹ค. (๋ฐฐ์—ด์€ ์˜ˆ์™ธ)

 

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

compareTo๋Š” Object์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹จ์ˆœ ๋™์น˜์„ฑ ๋น„๊ต์— ๋”ํ•ด ์ˆœ์„œ๊นŒ์ง€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Comparable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” Arrays.sort(); ์ฒ˜๋Ÿผ ์†์‰ฝ๊ฒŒ ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Comparable์„ ๊ตฌํ˜„ํ•˜๋ฉด ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋งŽ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์•ŒํŒŒ๋ฒณ, ์ˆซ์ž, ์—ฐ๋Œ€์™€ ๊ฐ™์ด ์ˆœ์„œ๊ฐ€ ๋ช…ํ™•ํ•œ ๊ฐ’ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•˜์ž
  • Comparable์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ํ•„๋“œ๋‚˜ ํ‘œ์ค€์ด ์•„๋‹Œ ์ˆœ์„œ๋กœ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค๋ฉด Comparator๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•œ๋‹ค.

์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ compareTo์˜ ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜ ํƒ€์ž…์€ ์ปดํŒŒ์ผ ํƒ€์ž…์— ์ •ํ•ด์ง„๋‹ค.

public final class CaseInsensetiveString implements Comparable<CaseInsensitiveString> {
  	public int compareTo(CaseInsensitiveString cis) {
      	return String.CASE_INSENSITIVE_ORDER.compare(s. cis.s);
    }
}

 

ํด๋ž˜์Šค์— ํ•ต์‹ฌ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ํ•„๋“œ๋ถ€ํ„ฐ ๋น„๊ตํ•˜์ž. ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋ฉด ์ฆ‰, ์ˆœ์„œ๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ๋‹ค๋ฉด ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด ์ดํ›„ ํ•„๋“œ์—์„œ ๊ณ„์† ๋น„๊ต๋ฅผ ์ง„ํ–‰ํ•ด ๋‚˜๊ฐ„๋‹ค.

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์—์„œ ์ถ”๊ฐ€๋œ ๋น„๊ต์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

// ์ฝ”๋“œ 14-3 ๋น„๊ต์ž ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ๋น„๊ต์ž (92์ชฝ)
    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);
    }

 

์ด๋”ฐ๊ธˆ '๊ฐ’์˜ ์ฐจ'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์Œ์ˆ˜์™€ 0 ๊ทธ๋ฆฌ๊ณ  ์–‘์ˆ˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” CompareTo ๋ฉ”์„œ๋“œ๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋‚˜ ๋ถ€๋™์†Œ์ˆ˜์  ๊ณ„์‚ฐ ๋ฐฉ์‹์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ž.

static Comparator<Object> hasCodeOrder = new Comparator<>() {
	public int compare(Object o1, Object o2) {
    	return Integer.compare(o1.haseCode(), o2.haseCode());
    }
}