[JAVA] boxingκ³Ό unboxing

κ°•λ―ΌμŠΉΒ·2023λ…„ 8μ›” 31일
0

JAVA

λͺ©λ‘ 보기
7/15

πŸ“Œ Boxing

μžλ°”λŠ” int, long, boolean 같은 λ³€μˆ˜μ˜ κΈ°λ³Έ μžλ£Œν˜•(Primitive Type)을 μ œκ³΅ν•œλ‹€. ν•˜μ§€λ§Œ 이런 κΈ°λ³Έμžλ£Œν˜•μ€ μ»¬λ ‰μ…˜(Collection)μ΄λ‚˜ μ§€λ„€λ¦­(Generic)μ—μ„œ μ œν•œμ μœΌλ‘œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ μžλ°”λŠ” 각 κΈ°λ³Έ μžλ£Œν˜•μ— λŒ€μ‘λ˜λŠ” 래퍼 클래슀(Wrapper Class) μ œκ³΅ν•˜κ³  μžˆλ‹€.

기본적인 λ°•μ‹± λ™μž‘

public class Boxing {
    public static void main(String[] args) {
        
        int i = 10;
        Integer wI = new Integer(a); // int Boxing λ™μž‘
        
        double d = 3.14;
        Double wD = new Double(d); // double Boxing λ™μž‘
        
        boolean b = true;
        Boolean wB = new Boolean(b); // boolean Boxing λ™μž‘
    }
}

반면 μ–Έλ°•μ‹± λ™μž‘

public class Boxing {
    public static void main(String[] args) {
        
        Integer wI = new Integer(10);
        int i = wI.intValue();     // Integer Unboxing λ™μž‘
        
        Double wD = new Double(3.14);
        double d = wD.doubleValue(); // Double Unboxing λ™μž‘
        
        Boolean wB = new Boolean(true);
        boolean b = wB.booleanValue(); // Boolean Unboxing λ™μž‘
    }
}

πŸ“ λ°•μ‹±

μ˜€ν† λ°•μ‹±(Auto boxing)κ³Ό μ˜€ν†  μ–Έλ°•μ‹±(Auto unboxing)
λͺ…μ‹œμ μœΌλ‘œ κΈ°λ³Έ μžλ£Œν˜•μ„ 래퍼클래슀둜 λ°•μ‹±ν•˜κ³  μ–Έλ°•μ‹±ν•˜λŠ” λ™μž‘μ€ 크게 μ–΄λ ΅μ§€ μ•Šλ‹€. λ‹€λ§Œ μ΄λŸ¬ν•œ κΈ°λ³Έμžλ£Œν˜•κ³Ό 래퍼 ν΄λž˜μŠ€κ°„μ˜ λ³€ν™˜μ΄ λ¬΅μ‹œμ (Implicit)으둜 μΌμ–΄λ‚˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μžλ°”μ˜ νŠΉμ •λ²„μ „(JDK 1.5)λΆ€ν„°λŠ” μžλ°” μ–Έμ–΄μ—μ„œ 래퍼 ν΄λž˜μŠ€μ™€ κΈ°λ³Έ μžλ£Œν˜• μ‚¬μ΄μ˜ λ³€ν™˜μ„ μžλ™μœΌλ‘œ ν•΄μ£ΌλŠ” λ™μž‘μ΄ μΆ”κ°€λ˜μ—ˆλ‹€. 이λ₯Ό μ˜€ν†  λ°•μ‹±(Auto Boxing)κ³Ό μ˜€ν†  μ–Έλ°•μ‹±(Auto Unboxing)이라고 ν•œλ‹€.

λ‹€μŒ 예λ₯Ό μ‚΄νŽ΄λ³΄μž.

λ°•μ‹±κ³Ό μ–Έλ°•μ‹±

public class WrapperEx04 {
    public static void main(String[] args) {
        int i = 10;
        Integer wI = i;    // Auto boxing
        int i1 = wI;       // Auto unboxing
        
        double d = 3.14;
        Double wD = d;     // Auto boxing
        double d1 = wD;    // Auto unboxing
        
        boolean b = true;
        Boolean wB = b;    // Auto boxing
        boolean b1 = wB;   // Auto unboxing
    }
}

int ν˜• λ³€μˆ˜μ— 10μ΄λΌλŠ” 값을 λŒ€μž…ν•œ λ‹€μŒ, 이λ₯Ό Integer 래퍼 ν΄λž˜μŠ€μ— ν• λ‹Ήν–ˆλ‹€. μ›λž˜λŠ” intλΌλŠ” κΈ°λ³Έ μžλ£Œν˜•μ„ Integer 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.

래퍼 클래슀 μ–Έλ°•μ‹±

Integer wI = new Integer(10);  // λͺ…μ‹œμ  λ°•μ‹±
Integer wI1 = 10;              // μ˜€ν†  λ°•μ‹±

ν•˜μ§€λ§Œ JDK 1.5 λ²„μ „λΆ€ν„°λŠ” μœ„ 두 ꡬ문이 같은 의미λ₯Ό κ°–κ²Œ λœλ‹€. μ–Έμ–΄κ°€ μžλ™μœΌλ‘œ 박싱을 ν•΄μ€€λ‹€ν•˜μ—¬ μ˜€ν† λ°•μ‹±μ΄λΌκ³  λΆ€λ₯Έλ‹€.

μ˜€ν†  언박싱도 λ§ˆμ°¬κ°€μ§€λ‹€.

μ˜€ν†  μ–Έλ°•μ‹±

Integer wI = new Integer(10);
int i1 = wI.intValue(); // μ–Έλ°•μ‹±
int i2 = wI; // μ˜€ν†  μ–Έλ°•μ‹±

10μ΄λΌλŠ” μ •μˆ˜κ°€ λ‹΄κΈ΄ 래퍼 클래슀λ₯Ό i1 λ³€μˆ˜μ— μ–Έλ°•μ‹±ν–ˆλ‹€. i2 λ³€μˆ˜μ—λŠ” μ˜€ν†  μ–Έλ°•μ‹±λ˜μ–΄ μ—­μ‹œ 10μ΄λΌλŠ” 값이 λ‹΄κΈ΄λ‹€.

래퍼 클래슀의 μ—°μ‚°
C++κ³Ό λ‹€λ₯΄κ²Œ μžλ°”λŠ” μ—°μ‚°μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•  수 μ—†λ‹€. κ·Έλ ‡λ‹€λ©΄ λ‹€μŒ μ½”λ“œλŠ” μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

μ˜ˆμ‹œ μ½”λ“œ


Integer i1 = new Integer(10);
Integer i2 = new Integer(20);

Integer i3 = i1 + i2; // λ™μž‘ν• κΉŒ?

두 개의 래퍼 클래슀인 i1κ³Ό i2λ₯Ό '+' μ—°μ‚°μžλ‘œ μ—°κ²°ν•˜λ©΄ μ–΄λ–»κ²Œ 될까? μ›λž˜ 래퍼 ν΄λž˜μŠ€λ„ 객체둜 λ§Œλ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ— + 연산을 ν•  수 μ—†λ‹€. ν•˜μ§€λ§Œ μžλ°”μ—μ„œλŠ” 래퍼 ν΄λž˜μŠ€μ— λŒ€ν•œ 연산이 μ‹œλ„λ  λ•Œ, μ˜€ν†  언박싱을 ν•΄μ„œ λ‘˜ λ‹€ intν˜•μœΌλ‘œ λ§Œλ“€μ–΄μ„œ 연산을 μˆ˜ν–‰ν•œλ‹€. 래퍼 ν΄λž˜μŠ€μ™€ κΈ°λ³Έν˜• κ°„μ˜ 연산도 λ§ˆμ°¬κ°€μ§€λ‘œ λ™μž‘ν•œλ‹€.

μ£Όμ˜ν•΄μ•Ό ν•  연산은 '==' 연산이닀.

'==' μ—°μ‚° μ˜ˆμ‹œ μ½”λ“œ

Integer i1 = new Integer(10);
Integer i2 = new Integer(10);

if (i1 == i2)
    System.out.println("κ°™λ‹€");
else
    System.out.println("λ‹€λ₯΄λ‹€");

이 μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜λ©΄, "λ‹€λ₯΄λ‹€"λΌλŠ” λ¬Έμžμ—΄μ΄ 좜λ ₯λœλ‹€. '==' 연산은 μ°Έμ‘° λ³€μˆ˜μ˜ μ£Όμ†Œκ°’μ„ λΉ„κ΅ν•˜λŠ” 연산이닀. i1κ³Ό i2λŠ” κ·Έ μ•ˆμ— λ‹΄κ³  μžˆλŠ” 값은 κ°™μ§€λ§Œ νž™ λ©”λͺ¨λ¦¬μ˜ 별도 μ£Όμ†Œκ³΅κ°„μ— λ§Œλ“€μ–΄μ§€λŠ” λ‹€λ₯Έ 객체닀. λ”°λΌμ„œ μ°Έμ‘° 값이 λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— i1 == i2 λΌλŠ” 쑰건은 거짓이 λœλ‹€.

λ§Œμ•½ λ‚΄μš©μ„ κ²€μ‚¬ν•˜λ €λ©΄ '.equals()' λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.

profile
Step by Step goes a long way. κΎΈμ€€ν•˜κ²Œ μ„±μž₯ν•˜λŠ” 개발자 κ°•λ―ΌμŠΉμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€