[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item26. 둜 νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라.

2023. 3. 15. 11:17ㆍJAVA/Effective JAVA

728x90

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item26. 둜(Law) νƒ€μž…μ€ μ‚¬μš©ν•˜μ§€ 말라.

4번째 μ±•ν„°λ‘œ λ“€μ–΄μ˜€λ©΄μ„œ μ œλ„€λ¦­ νƒ€μž…κ³Ό κ΄€λ ¨λœ item듀을 곡뢀할 μ˜ˆμ •μ΄λ‹€. 

μ œλ„€λ¦­ νƒ€μž…μ€ μ˜€λž˜μ „λΆ€ν„° λ“€μ–΄μ˜¨ κΈ°λŠ₯인데 λ­”κ°€ μ‚¬μš©ν•˜κΈ° μ–΄λ €μš΄? λŠλ‚Œμ΄ κ°•ν•΄μ„œ λ‚΄κ°€ 직접 μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” μ μ—ˆλŠ”λ° 사싀 μ œλ„€λ¦­ νƒ€μž…μ€ λ°˜λŒ€λ‘œ μ‚¬μš©ν•˜κΈ° νŽΈν•˜λΌκ³  λ§Œλ“€μ–΄μ§„ κΈ°λŠ₯이닀. 

λ”°λΌμ„œ μ΄νŽ™ν‹°λΈŒ μžλ°” 4μž₯을 κ³΅λΆ€ν•˜λ©΄μ„œ 이번 κΈ°νšŒμ— μ œλ„€λ¦­ νƒ€μž…κ³Ό μΉœν•΄μ§ˆ(?) μ˜ˆμ •μ΄λ‹·!!! 

μ œλ„€λ¦­ νƒ€μž…κ³Ό μΉœν•΄μ§€κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € μš©μ–΄λ₯Ό μ•Œμ•„μ•Ό ν•˜λŠ”λ° 마침 κ°•μ˜μ—μ„œλ„ μš©μ–΄ 정리λ₯Ό μ‹œμž‘μ„ ν•˜κΈ° λ•Œλ¬Έμ— 이번 κΈ€μ—μ„œλŠ” μ œλ„€λ¦­ κ΄€λ ¨ μš©μ–΄ 정리λ₯Ό ν•œλ‹€. πŸ₯

 

 

μ œλ„€λ¦­ Generic 

μ œλ„€λ¦­μ€ μžλ°”5λΆ€ν„° μ‚¬μš©ν•  수 μžˆμ—ˆλŠ”λ° μ œλ„€λ¦­μ„ μ§€μ›ν•˜κΈ° μ „κΉŒμ§€λŠ” μ»¬λ ‰μ…˜μ—μ„œ 객체λ₯Ό κΊΌλ‚Όλ•Œλ§ˆλ‹€ ν˜•λ³€ν™˜μ„ ν–ˆμ–΄μ•Ό ν–ˆλ‹€. λ”°λΌμ„œ λˆ„κ΅°κ°€ μ‹€μˆ˜λ‘œ λ‹€λ₯Έ 값을 넣어두면 λŸ°νƒ€μž„μ— ν˜•λ³€ν™˜ 였λ₯˜κ°€ λ‚˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. 

반면, μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ μ»¬λ ‰μ…˜μ΄ 담을 수 μžˆλŠ” νƒ€μž…μ„ μ»΄νŒŒμΌλŸ¬μ— μ•Œλ €μ£Όκ²Œ λœλ‹€. κ·Έλž˜μ„œ μ»΄νŒŒμΌλŸ¬λŠ” μ•Œμ•„μ„œ ν˜•λ³€ν™˜ μ½”λ“œλ₯Ό μΆ”κ°€ν•  수 있게 되고, μ—‰λš±ν•œ νƒ€μž…μ˜ 객체λ₯Ό λ„£μœΌλ €λŠ” μ‹œλ„λ₯Ό 컴파일 κ³Όμ •μ—μ„œ μ°¨λ‹¨ν•˜μ—¬ 더 μ•ˆμ „ν•˜κ³  λͺ…ν™•ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ–΄μ€€λ‹€. 

 

 

 

 

둜 νƒ€μž… 

List numbers = new ArrayList();
numbers.add(10);
numbers.add("whiteShip");

for (Object number : numbers) {
    System.out.println("number = " + (Integer)number); // error!
}

둜 νƒ€μž…μ€ μ œλ„€λ¦­ νƒ€μž…μ—μ„œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μ „ν˜€ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œλ₯Ό λ§ν•œλ‹€.  μ΄λ ‡κ²Œ List 자체λ₯Ό 둜 νƒ€μž…μ΄λΌκ³  ν•œλ‹€. 

μ΄λ ‡κ²Œ μ œλ„€λ¦­ νƒ€μž…μ„ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ numbers List μ•ˆμ— μœ„μ— μ˜ˆμ‹œμ²˜λŸΌ 10, whiteShip 처럼 아무 νƒ€μž…μ΄λ‚˜ add ν•  수 μžˆλ‹€. 

μ•„λ¬΄κ°’μ΄λ‚˜ λ„£μœΌλ©΄ μœ„ν—˜ν•œ μ΄μœ λŠ” 밑에 for문을 ν†΅ν•΄μ„œ numbers의 값을 좜λ ₯ν•˜κ³  μžˆλŠ”λ° numbers에 숫자만 λ“€μ–΄κ°ˆ 것이라고 μƒκ°ν•΄μ„œ (Integer)둜 ν˜•λ³€ν™˜μ„ ν•˜λŠ”λ° μ΄λ•Œ whiteShip은 integer둜 ν˜•λ³€ν™˜μ„ ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ—λŸ¬κ°€ λ‚˜λŠ” 상황이 λ°œμƒν•œλ‹€. 

 

λ¬Όλ‘  μ§€κΈˆμ€ μ½”λ“œκ°€ 맀우맀우 κ°„λ‹¨ν•˜λ‹ˆκΉŒ μ–΄λ””κ°€ λ¬Έμ œμΈμ§€ 금방 νŒŒμ•…ν•  수 μžˆμ§€λ§Œ.. 우리.. μ‹€λ¬΄μ—μ„œ μ½”λ“œκ°€ μ΄λ ‡κ²Œ κ°„λ‹¨ν•˜μ§€ μ•ŠμœΌλ‹ˆ γ…Žγ…Ž 

그럴 땐 λ¬Όλ‘  νŒŒμ•…μ΄ 어렡겠지..

 

 

 

μ œλ„€λ¦­ νƒ€μž… , λ§€κ°œλ³€μˆ˜ν™” νƒ€μž… 

        List<Integer> numbers2 = new ArrayList<>();
        numbers2.add(10);
//        numbers2.add("whiteShip"); // compile error λ°œμƒ

        for (Integer integer : numbers2) {
            System.out.println("integer = " + integer);
        }

ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— νƒ€μž… λ§€κ°œλ³€μˆ˜κ°€ 쓰이면 이λ₯Ό μ œλ„€λ¦­ 클래슀, μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•œλ‹€.

그리고 이 μ œλ„€λ¦­ ν΄λž˜μŠ€μ™€ μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν‹€μ–΄μ„œ μ œλ„€λ¦­ νƒ€μž…μ΄λΌκ³  ν•œλ‹€. 

μ œλ„€λ¦­ νƒ€μž…μ€ 일련의 λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ„ μ •μ˜ν•΄μ•Ό ν•œλ‹€. 

μ œλ„€λ¦­ νƒ€μž…μ€ λ¨Όμ € 클래슀(ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€) 이름이 λ‚˜μ˜€κ³  , μ΄μ–΄μ„œ κΊΎμ‡ κ΄„ν˜Έ μ•ˆμ— μ‹€μ œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ“€μ„ λ‚˜μ—΄ν•œλ‹€. 

List<E> 처럼 ν‘œν˜„ν•˜λŠ” 것을 λ§ν•˜κ³  List<Integer>λŠ” λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ΄λΌκ³  ν•œλ‹€. 

 

νƒ€μž… λ§€κ°œλ³€μˆ˜ 

List<E> μ—μ„œ E λ₯Ό νƒ€μž… λ§€κ°œλ³€μˆ˜λΌκ³  ν•˜λŠ”λ° 보톡 E라고 많이 ν•˜μ§€λ§Œ μ‚¬μš©μžκ°€ μ •μ˜ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆκΈ°λŠ” ν•˜λ‹€. 

 

μ‹€μ œ λ§€κ°œλ³€μˆ˜ 

List<Integer> μ—μ„œ Integerκ°€ μ‹€μ œ λ§€κ°œλ³€μˆ˜μ΄λ‹€. 

 

 

public class Box<E /*extends Number*/> { 

    private E item;

    private void add(E e) {
        this.item = e;
    }

    private E get() {
        return this.item;
    }

    public static void main(String[] args) {
        Box<Integer> box = new Box<>(); 
        box.add(10);
        System.out.println(box.get() * 100);
        printBox(box);

    }
    private static void printBox(Box<?> box) { 
        System.out.println("box = " + box.get());
    }
}

μ—¬κΈ°μ„œ Box<E>κ°€ μ œλ„€λ¦­ ν΄λž˜μŠ€μ΄λ‹€. 

 

ν•œμ •μ  νƒ€μž…  λ§€κ°œλ³€μˆ˜

ν•œμ •μ  νƒ€μž… λ§€κ°œλ³€μˆ˜λŠ” Box<E extends Number> 처럼 Numberλ₯Ό 상속받은 νƒ€μž…λ§Œ λ“€μ–΄μ˜¬ 수 μžˆλ„λ‘ ν•œμ •ν•˜λŠ” 것을 λ§ν•œλ‹€. 

Box<String>은 μ—λŸ¬ λ‚œλ‹€. 

 

λΉ„ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œ νƒ€μž…

Box<?> 처럼 ? λ₯Ό μ‚¬μš©ν•œ 것을 λ§ν•˜λŠ”λ° λΉ„ν•œμ •μ  μ™€μΌλ“œ μΉ΄λ“œλŠ” 아무 κ°’μ΄λ‚˜ λŒ€μ‘μ΄ λœλ‹€. 

 

ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œ νƒ€μž…

Box<? extends Number> 처럼 Numberλ₯Ό 상속받은 νƒ€μž…μœΌλ‘œ μ œν•œν•œλ‹€. 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90