Item 28. List vs Array

λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μ‚¬μš©ν•˜λΌ

μ•„μ΄ν…œμ˜ 주제처럼 λ°°μ—΄λ³΄λ‹€λŠ” 리슀트λ₯Ό μš°μ„ ν•΄μ•Όν•˜μ§€λ§Œ 무쑰건적으둜 배열을 μ‚¬μš©ν•˜μ§€ λ§λΌλŠ” 것은 μ•„λ‹ˆλ‹€. λ¦¬μŠ€νŠΈλŠ” κ²°κ΅­ Java κΈ°λ³Έ νƒ€μž…μ΄ μ•„λ‹ˆλ©°(λ‚΄λΆ€ κ΅¬ν˜„μ—μ„œ λ°°μ—΄ μ‚¬μš©), μ„±λŠ₯이 μ€‘μš”ν•œ 상황(HashMap)μ—μ„œλŠ” 배열을 μ‚¬μš©ν•˜κ³  μžˆλ‹€. ν•˜μ§€λ§Œ κΌ­ 배열을 μ‚¬μš©ν•΄μ•Όν•˜λŠ” 상황이 μ•„λ‹ˆλΌλ©΄ 리슀트λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

λ°°μ—΄κ³Ό μ œλ„€λ¦­ νƒ€μž…μ˜ 차이

λ°°μ—΄κ³Ό μ œλ„€λ¦­ νƒ€μž… μ‚¬μ΄μ˜ 큰 μ°¨μ΄λ‘œλŠ” 곡변과 싀체화가 μžˆλŠ”λ°, μžμ„Ένžˆ μ•Œμ•„λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

곡변(covariant)

Subκ°€ Super의 ν•˜μœ„ νƒ€μž…μ΄λΌλ©΄ λ°°μ—΄ Sub[]λŠ” λ°°μ—΄ Super[]의 ν•˜μœ„ νƒ€μž…μ΄ λ˜μ§€λ§Œ, μ œλ„€λ¦­ νƒ€μž… ListλŠ” List의 ν•˜μœ„ νƒ€μž…μ΄ λ˜μ§€ μ•ŠμœΌλ©°, μƒμœ„ νƒ€μž…λ„ μ•„λ‹ˆλ‹€.

class Main {

    public static void main(String[] args) {
        Object[] objectArray = new Long[1];
        objectArray[0] = "I don't fit in"; // λŸ°νƒ€μž„ μ—λŸ¬, ArrayStoreException

        List<Object> ol = new ArrayList<Long>(); // 컴파일 μ—λŸ¬, Incompatible types
        ol.add("I don't fit in");
    }
}

이 μ°¨μ΄λŠ” μœ„ μ½”λ“œμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 배열은 곡변을 ν—ˆμš©ν•˜μ—¬ λŸ°νƒ€μž„μ— λ¬Έμ œκ°€ λ°œμƒν•˜μ§€λ§Œ, μ œλ„€λ¦­μ€ 컴파일 μ‹œμ— λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 보닀 μ•ˆμ „ν•˜λ‹€.

싀체화(reify)

λ§ˆμ°¬κ°€μ§€λ‘œ 배열은 μ‹€μ²΄ν™”λ˜κ³ , μ œλ„€λ¦­μ€ μ‹€μ²΄ν™”λ˜μ§€ μ•ŠλŠ” 차이가 μžˆλ‹€. 이 차이둜 μœ„ μ½”λ“œμ—μ„œ λ°œμƒν•˜λŠ” μ°¨μ΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  • λ°°μ—΄: λŸ°νƒ€μž„μ—λ„ μžμ‹ μ΄ λ‹΄κΈ°λ‘œ ν•œ μ›μ†Œμ˜ νƒ€μž…μ„ μΈμ§€ν•˜κ³  ν™•μΈν•˜μ—¬ ArrayStoreException을 λ°œμƒμ‹œν‚΄

  • μ œλ„€λ¦­: μ œλ„€λ¦­μ€ νƒ€μž… 정보λ₯Ό 컴파일 νƒ€μž„μ—λ§Œ κ²€μ‚¬ν•˜κ³ λŸ°νƒ€μž„μ— μ†Œκ±°λ˜κΈ° λ•Œλ¬Έμ— λŸ°νƒ€μž„μ—λŠ” νƒ€μž… 정보λ₯Ό μ•Œ 수 μ—†μŒ

    • E, List<E>, List<String> 같은 νƒ€μž…μ„ 싀체화 λΆˆκ°€ νƒ€μž…(non-reifiable type)이라고 함

    • 싀체화 λ˜μ§€ μ•Šμ•„ λŸ°νƒ€μž„μ— μ»΄νŒŒμΌνƒ€μž„λ³΄λ‹€ νƒ€μž… 정보λ₯Ό 적게 κ°€μ§€κ³  있음

    • λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ„ 싀체화할 수 μžˆλŠ” νƒ€μž…μ€ λΉ„ν•œμ •μ  μ™€μΌλ“œμΉ΄λ“œ(List<?>, Map<?, ?> λ“±)νƒ€μž…μœΌλ‘œ ν•œμ •λ¨

이처럼 곡변/싀체화에 μžˆμ–΄ μ„œλ‘œ λ°˜λŒ€λ˜λŠ” μ„±μ§ˆμ„ κ°€μ§€κ³  있기 λ•Œλ¬Έμ— λ°°μ—΄κ³Ό μ œλ„€λ¦­μ€ 잘 μ–΄μš°λŸ¬μ§€μ§€ λͺ»ν•œλ‹€.

μ œλ„€λ¦­ λ°°μ—΄

이처럼 잘 μ–΄μš°λŸ¬μ§€κΈ° νž˜λ“€κΈ° λ•Œλ¬Έμ— μ œλ„€λ¦­ 배열을 λ§Œλ“œλ €κ³  μ‹œλ„ν•˜λ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€. λ§Œμ•½ 이λ₯Ό ν—ˆμš©ν•˜κ³  1번 라인 μ½”λ“œμ—μ„œ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€κ³  κ°€μ •ν•˜λŠ” 경우 λ‹€μŒκ³Ό 같은 λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

이처럼 μ˜ˆμƒμΉ˜ λͺ» ν•œ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— μžλ°” μ»΄νŒŒμΌλŸ¬μ—μ„œλŠ” 1번 라인의 μ œλ„€λ¦­ 배열을 μƒμ„±ν•˜λŠ” μ½”λ“œλ₯Ό 컴파일 μ—λŸ¬λ‘œ μ²˜λ¦¬ν•œλ‹€.

싀체화 λΆˆκ°€ νƒ€μž…

싀체화 λΆˆκ°€ νƒ€μž…μœΌλ‘œ 배열을 μƒμ„±ν•˜λŠ” 경우 컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜μ§€λŠ” μ•Šμ§€λ§Œ κ²½κ³ κ°€ λ°œμƒν•œλ‹€.(νƒ€μž… μ•ˆμ „μ„±μ΄ 보μž₯λ˜μ§€ μ•ŠμŒμ„ μ•Œλ €μ€Œ)

μœ„ μ½”λ“œμ—μ„œλŠ” μ •μƒμ μœΌλ‘œ 컴파일 되고, λŸ°νƒ€μž„μ—μ„œλ„ λ°œμƒν•˜μ§€λŠ” μ•Šμ•„ μ•ˆμ „ν•˜λ‹€κ³  ν™•μ‹ ν•  수 μžˆλŠ” κ²½μš°μ—” @SuppressWarnings("unchecked") μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜μ—¬ κ²½κ³ λ₯Ό 숨길 수 μžˆλ‹€. ν•˜μ§€λ§Œ 이 λ°©λ²•λ³΄λ‹€λŠ” μ„±λŠ₯ 상 손해λ₯Ό λ³Ό 수 μžˆμ§€λ§Œ 리슀트λ₯Ό μ‚¬μš©ν•˜μ—¬ 경고의 원인을 μ œκ±°ν•˜λŠ” 것이 더 μ’‹λ‹€.

Last updated

Was this helpful?