Item 52. Overloading

๋‹ค์ค‘์ •์˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•˜๋ผ

๋ฉ”์„œ๋“œ ๋‹ค์ค‘ ์ •์˜(overloading)๋ž€ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋ฅผ ๋งํ•œ๋‹ค. ๋‹ค์ค‘์ •์˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํŽธ์˜๋ฅผ ์ œ๊ณตํ•ด์ฃผ์ง€๋งŒ, ์–ด๋Š ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ ์ง€ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

class CollectionClassifier {
    public static String classify(Set<?> s) {
        return "์ง‘ํ•ฉ";
    }

    public static String classify(List<?> lst) {
        return "๋ฆฌ์ŠคํŠธ";
    }

    public static String classify(Collection<?> c) {
        return "๊ทธ ์™ธ";
    }

    public static void main(String[] args) {
        Collection<?>[] collections = {
                new HashSet<String>(),
                new ArrayList<BigInteger>(),
                new HashMap<String, String>().values()
        };

        for (Collection<?> c : collections) {
            // ์ปดํŒŒ์ผํƒ€์ž„์— c๋Š” ํ•ญ์ƒ Collection<?> ํƒ€์ž…์ด๋ฏ€๋กœ ๋ชจ๋‘ "๊ทธ ์™ธ" ์ถœ๋ ฅ
            System.out.println(classify(c));
        }
    }
}

์œ„ ์ฝ”๋“œ์˜ ์˜๋„๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋Œ€์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ปดํŒŒ์ผํƒ€์ž„์— c๋Š” ํ•ญ์ƒ Collection<?> ํƒ€์ž…์ด๋ฏ€๋กœ, ๋ชจ๋‘ "๊ทธ ์™ธ"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ์˜๋„๋Œ€๋กœ ๋™์ž‘๋˜๊ธธ ์›ํ•œ๋‹ค๋ฉด, ๋ชจ๋“  classify ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ํ•ฉ์นœ ํ›„ instanceof๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

class CollectionClassifier {
    public static String classify(Collection<?> c) {
        return c instanceof Set ? "์ง‘ํ•ฉ" :
                c instanceof List ? "๋ฆฌ์ŠคํŠธ" : "๊ทธ ์™ธ";
    }

    // ...
}

๋‹ค์ค‘์ •์˜ ํ˜ผ๋™ ํšŒํ”ผ ๋ฐฉ๋ฒ•

์œ„์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์• ์ดˆ์— ํ˜ผ๋™์„ ์ผ์œผํ‚ค๋Š” ์ƒํ™ฉ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ œ์ผ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋‹ค์ค‘์ •์˜๋Š” ๋งŒ๋“ค์ง€ ์•Š๊ณ , ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์ค‘์ •์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋‹ค์ค‘์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์ค‘์ •์˜ ๋Œ€์‹ ์— ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ง€์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค.

// ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ ObjectInputStream์˜ ๋ฉ”์„œ๋“œ
public class ObjectOutputStream
        extends OutputStream implements ObjectOutput, ObjectStreamConstants {

    // ...

    public void writeChar(int val) throws IOException {
        bout.writeChar(val);
    }

    public void writeInt(int val) throws IOException {
        bout.writeInt(val);
    }

    public void writeLong(long val) throws IOException {
        bout.writeLong(val);
    }

    public void writeFloat(float val) throws IOException {
        bout.writeFloat(val);
    }

    // ...
}

์ƒ์„ฑ์ž

๋ฉ”์„œ๋“œ๋Š” ์œ„์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ง€์–ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ํ˜ผ๋™์„ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒ์„ฑ์ž๋Š” ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ง€์–ด์ค„ ์ˆ˜ ์—†๋‹ค. ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž์—์„  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ผ๋™์„ ํšŒํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ •์  ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์œผ๋กœ ์ƒ์„ฑ์ž ์ง์ ‘ ์‚ฌ์šฉ์„ ๋Œ€์ฒด

  • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜๋„๋ก ํ•˜์—ฌ ์–ด๋Š ๊ฒƒ์ด ํ˜ธ์ถœ๋ ์ง€ ํ˜ผ๋™๋˜์ง€ ์•Š๋„๋ก ํ•จ

    • ex) ArrayList(int initialCapacity) vs ArrayList(Collection<? extends E> c)

๋‹ค์ค‘์ •์˜ ํ˜ผ๋™์œผ๋กœ ์ƒ๊ธฐ๋Š” ์˜ˆ์‹œ

List.remove(int index) vs List.remove(Object o)

์ œ๋„ค๋ฆญ๊ณผ ์˜คํ† ๋ฐ•์‹ฑ์˜ ๋“ฑ์žฅ์œผ๋กœ ๋‹ค์ค‘์ •์˜ ํ˜ผ๋™์ด ๋”์šฑ ์‹ฌํ•ด์กŒ๋Š”๋ฐ, ๋Œ€ํ‘œ์ ์œผ๋กœ List์˜ remove ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค.

class SetList {
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();
        List<Integer> list = new ArrayList<>();

        for (int i = -3; i < 3; i++) {
            set.add(i);
            list.add(i);
        }

        for (int i = 0; i < 3; i++) {
            set.remove(i);
            list.remove(i);
        }

        System.out.println(set + " " + list);
        // ์˜ˆ์ƒ: [-3, -2, -1] [-3, -2, -1]
        // ์‹ค์ œ: [-3, -2, -1] [-2, 0, 2]
    }
}

set์€ remove(Object o) ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์˜๋„๋Œ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€๋งŒ, list๋Š” remove(Object o)๊ฐ€ ์•„๋‹Œ remove(int index) ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์ค‘์ •์˜๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€์ •ํ•œ ์ธ๋ฑ์Šค์˜ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋œ๋‹ค. (๋งŒ์•ฝ ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด, list.remove(i) ๋Œ€์‹  list.remove((Integer) i)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.)

Last updated