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

Was this helpful?