Item 61. Primitive Type & Boxed Primitive Type

λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…λ³΄λ‹€λŠ” κΈ°λ³Έ νƒ€μž…μ„ μ‚¬μš©ν•˜λΌ

μžλ°”μ˜ 데이터 νƒ€μž…μ€ 크게 κΈ°λ³Έ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μœΌλ‘œ λ‚˜λ‰˜λŠ”λ°, 각각 κΈ°λ³Έ νƒ€μž…μ—λ„ λŒ€μ‘ν•˜λŠ” μ°Έμ‘° νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€. 이λ₯Ό λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…μ΄λΌκ³  ν•œλ‹€.(예: int -> Integer) μ΅œμ‹  μžλ°”μ—μ„œλŠ” μ˜€ν† λ°©μ‹ 및 μ˜€ν† μ–Έλ°•μ‹± 덕뢄에 두 νƒ€μž…μ„ κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μ‹€μ œλ‘œλŠ” 크게 μ„Έ 가지 차이점이 μ‘΄μž¬ν•œλ‹€.

  1. κΈ°λ³Έ νƒ€μž…μ€ κ°’λ§Œ 가지고, λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…μ€ 값에 더해 μ‹λ³„μ„±μ΄λΌλŠ” 속성을 κ°–λŠ”λ‹€.

    • λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…μ€ 두 μΈμŠ€ν„΄μŠ€μ˜ 값이 같아도 λ‹€λ₯΄λ‹€κ³  식별될 수 있음

  2. κΈ°λ³Έ νƒ€μž…μ€ 항상 μœ νš¨ν•œ 값을 κ°€μ§ˆ 수 μžˆμ§€λ§Œ, λ°•μ‹±λœ νƒ€μž…μ€ nullable이닀.

  3. κΈ°λ³Έ νƒ€μž…μ΄ λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…λ³΄λ‹€ μ‹œκ°„κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λ©΄μ—μ„œ νš¨μœ¨μ μ΄λ‹€.

λ‹€μŒμ€ 2번으둜 인해 λ°œμƒν•  수 μžˆλŠ” 문제λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμ΄λ‹€.

class Example {
    public static void main(String[] args) {
        Comparator<Integer> naturalOrder =
                (i, j) -> (i < j)
                        ? -1
                        : (i == j ? 0 : 1);

        System.out.println(naturalOrder.compare(new Integer(59), new Integer(42)));    // 1
        System.out.println(naturalOrder.compare(new Integer(42), new Integer(59)));    // -1
        System.out.println(naturalOrder.compare(new Integer(59), new Integer(59)));    // 1, not 0!
    }
}

μ„œλ‘œ λ‹€λ₯Έ 값을 λ„£μ—ˆμ„ λ•ŒλŠ” μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜μ§€λ§Œ, 같은 값을 λ„£μ—ˆμ„ λ•ŒλŠ” 1이 μ•„λ‹Œ 0이 λ‚˜μ˜¨λŠ”λ°, λ‹€μŒκ³Ό 같이 μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ΄λ‹€.

  1. naturalOrder.compare(new Integer(59), new Integer(59))κ°€ μ‹€ν–‰λ˜λ©΄μ„œ μ„œλ‘œ λ‹€λ₯Έ 두 개의 Integer μΈμŠ€ν„΄μŠ€ 생성

  2. (i < j)μ—μ„œλŠ” κΈ°λ³Έ νƒ€μž… κ°’μœΌλ‘œ λ³€ν™˜λ˜μ–΄ μ‹€ν–‰λ˜μ–΄ falseκ°€ λ°˜ν™˜λ˜μ–΄ (i == j ? 0 : 1)이 싀행됨

  3. (i == j)μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€κ°€ 같은지 λΉ„κ΅λ˜μ–΄ falseκ°€ λ°˜ν™˜λ˜μ–΄ 1이 λ°˜ν™˜λ¨

이처럼 λ°•μ‹±λœ κΈ°λ³Έ νƒ€μž…μ— == μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ μ›ν•˜μ§€ μ•ŠλŠ” κ²°κ³Όκ°€ λ‚˜μ˜¬ 수 μžˆλ‹€. λ•Œλ¬Έμ— 비ꡐ할 λ•ŒλŠ” equals λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, λΉ„κ΅μžλ₯Ό μœ„μ²˜λŸΌ 직접 λ§Œλ“œλŠ” κ²ƒλ³΄λ‹€λŠ” Comparator.naturalOrder()λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

λ°•μ‹± νƒ€μž…κ³Ό κΈ°λ³Έ νƒ€μž…μ„ ν˜Όμš©ν•΄μ„œ μ‚¬μš©ν•  λ•Œμ˜ 주의점

λ°•μ‹± νƒ€μž…μ€ κΈ°λ³Έ νƒ€μž…κ³Ό 혼용된 μ—°μ‚°μ—μ„œλŠ” λ°•μ‹± νƒ€μž…μ΄ μžλ™μœΌλ‘œ μ–Έλ°•μ‹± 되기 λ•Œλ¬Έμ— 항상 μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

class Example {
    static Integer i;

    public static void main(String[] args) {
        if (i == 59) { // NullPointerException
            System.out.println("Hello Ogu!");
        }
    }
}

μœ„ μ½”λ“œμ—μ„  iκ°€ null둜 μ΄ˆκΈ°ν™” λ˜μ–΄ μžˆμ§€λ§Œ, κΈ°λ³Έ νƒ€μž…μΈ 59와 비ꡐ할 λ•Œ μžλ™μœΌλ‘œ μ–Έλ°•μ‹±λ˜μ–΄ NullPointerException이 λ°œμƒν•˜κ²Œ λœλ‹€.

λ°•μ‹±νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우

λ°•μ‹± νƒ€μž…μ€ μ„±λŠ₯ λ¬Έμ œλ‚˜ 비ꡐ에 μžˆμ–΄μ„œ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμ§€λ§Œ, λ‹€μŒκ³Ό 같은 κ²½μš°μ—λŠ” μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

  1. μ»¬λ ‰μ…˜μ˜ μ›μ†Œ, ν‚€, κ°’μœΌλ‘œ μ‚¬μš©ν•  λ•Œ

    • 컬렉셔은 κΈ°λ³Έ νƒ€μž…μ„ 담을 수 μ—†μœΌλ―€λ‘œ λ°•μ‹± νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  2. λ§€κ°œλ³€μˆ˜ν™” νƒ€μž…μ΄λ‚˜ λ§€κ°œλ³€μˆ˜ν™” λ©”μ„œλ“œμ˜ νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μ‚¬μš©ν•  λ•Œ

    • λ§ˆμ°¬κ°€μ§€λ‘œ νƒ€μž… λ§€κ°œλ³€μˆ˜μ—λŠ” κΈ°λ³Έ νƒ€μž…μ„ μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ λ°•μ‹± νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  3. λ¦¬ν”Œλ ‰μ…˜μ„ 톡해 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ

이 외에도 빈 κ°’μ΄λΌλŠ” 것을 λͺ…ν™•ν•˜κ²Œ ν‘œν˜„ν•΄μ•Ό ν•  λ•Œλ„ λ°•μ‹± νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•œλ‹€.

Last updated

Was this helpful?