item 20 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ถ”์ƒ ํด๋ž˜์Šค ๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ

  • ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์ •์˜ํ•œ ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ •์˜ํ•˜๊ณ  ์ผ๋ฐ˜ ๊ทœ์น™์„ ์ž˜ ์ง€ํ‚จ ํด๋ž˜์Šค๋ผ๋ฉด ๋‹ค๋ฅธ ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ๋“  ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.
  • ๊ธฐ์กด ํด๋ž˜์Šค์—๋„ ์†์‰ฝ๊ฒŒ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

๋‘ ํด๋ž˜์Šค๊ฐ€ ๊ฐ™์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ๊ทธ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ณ„์ธต๊ตฌ์กฐ์ƒ ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์กฐ์ƒ์ด์–ด์•ผ ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์— ์ปค๋‹ค๋ž€ ํ˜ผ๋ž€์„ ์ผ์œผํ‚จ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฏน์Šค์ธ(mixin) ์ •์˜์— ์•ˆ์„ฑ๋งž์ถค์ด๋‹ค.

๋ฏน์Šค์ธ์ด๋ž€ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ ๋ฏน์Šค์ธ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ์›๋ž˜์˜ ์ฃผ๋œ ํƒ€์ž… ์™ธ์—๋„ ํŠน์ • ์„ ํƒ์  ํ–‰์œ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ค€๋‹ค.

Comparable์€ ์ž์‹ ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค ๋ผ๋ฆฌ๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๋ฏน์Šค์ธ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋‹ค.

๋Œ€์ƒ ํƒ€์ž…์˜ ์ฃผ๋œ ๊ธฐ๋Šฅ์— ์„ ํƒ์  ๊ธฐ๋Šฅ์„ ํ˜ผํ•ฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฏน์Šค์ธ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋กœ๋Š” ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ํƒ€์ž… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ณ ๋„ ๋น„๋งŒ ๊ณ„์ธต ๊ตฌ์กฐ

  • ๋ชจ๋“  ์กฐํ•ฉ

  • ์กฐํ•ฉ ํญ๋ฐœ

// ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํด๋ž˜์Šค 
public abstract class AbstractMapEntry<K,V>
        implements Map.Entry<K,V> {
    // ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์—”ํŠธ๋ฆฌ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.
    @Override public V setValue(V value) {
        throw new UnsupportedOperationException();
    }
    
    // Map.Entry.equals์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    @Override public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof Map.Entry))
            return false;
        Map.Entry<?,?> e = (Map.Entry) o;
        return Objects.equals(e.getKey(),   getKey())
                && Objects.equals(e.getValue(), getValue());
    }

    // Map.Entry.hashCode์˜ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ๊ตฌํ˜„ํ•œ๋‹ค.
    @Override public int hashCode() {
        return Objects.hashCode(getKey())
                ^ Objects.hashCode(getValue());
    }

    @Override public String toString() {
        return getKey() + "=" + getValue();
    }
}

// ๋‹จ์ˆœ ๊ตฌํ˜„์€ ๊ณจ๊ฒฉ ๊ตฌํ˜„์˜ ์ž‘์€ ๋ณ€์ข…์œผ๋กœ Abstract Map.SimpleEntry๊ฐ€ ์ข‹์€ ์˜ˆ๋‹ค. 
// ๋‹จ์ˆœ ๊ตฌํ˜„๋„ ๊ณจ๊ฒฉ ๊ตฌํ˜„๊ณผ ๊ฐ™์ด ์ƒ์†์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ž€ ์ ์ด ๋‹ค๋ฅด๋‹ค. 

ํ•ต์‹ฌ ์ •๋ฆฌ

๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜์ž. 
๊ฐ€๋Šฅํ•œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํ™œ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 
โš ๏ธ **GitHub.com Fallback** โš ๏ธ